* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
72 KiB
Memory System (Kiswahili)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Chanzo cha ukweli:
src/lib/memory/nasrc/app/api/memory/Ilisasishwa mwisho: 2026-06-28 — v3.8.40 (imezimwa kwa chaguo-msingi + ulandanishaji wa ukadiriaji wa int8)
OmniRoute hutoa kumbukumbu endelevu ya mazungumzo inayotambulishwa kwa ufunguo wa API (na kwa hiari kitambulisho cha kipindi). Kumbukumbu hutolewa kiotomatiki kutoka kwenye majibu ya LLM kupitia ulinganishaji mwepesi wa ruwaza za regex na kuingizwa tena katika maombi yanayofuata kama ujumbe wa mfumo unaotangulia (au ujumbe wa kwanza wa mtumiaji kwa watoa huduma wanaokataa jukumu la mfumo).
Kumbukumbu IMEZIMWA kwa chaguo-msingi (v3.8.30+).
DEFAULT_MEMORY_SETTINGS.enabledsasa nifalse(src/lib/memory/settings.ts). Kuwasha kumbukumbu huingiza hadimaxTokens(~2k) za muktadha uliorejeshwa katika kila ombi la gumzo, ambalo hutozwa — gharama isiyotarajiwa kwa usakinishaji mpya na kwa viteja vinavyodhibiti muktadha wao wenyewe. Jiunge kwa uwazi chini ya Mipangilio → Kumbukumbu (MemorySkillsTabhuonyesha tahadhari ya gharama ya tokeni wakati kumbukumbu imewashwa). Kitega kinaweza kuzuia matumizi ya kumbukumbu kwa ombi moja kwa kutumia kichwa cha ombi chax-omniroute-no-memory(true/1/yes) — tazama jedwali la vichwa vya maombi katika API_REFERENCE.md. Ombi lisilotumia kumbukumbu huwekamemoryOwnerId = null, jambo linalozima zote mbili, uingizaji wa kumbukumbu na ujuzi, kwa ombi hilo (open-sse/handlers/chatCore/headers.ts::isNoMemoryRequested).
Kumbukumbu huwekewa upeo kwa kila ufunguo wa API, si kwa kila mtumiaji — kila ombi lililothibitishwa
kwa ufunguo uleule wa API hushiriki hifadhi ileile ya kumbukumbu, huku kukiwa na uwezekano wa kuweka upeo zaidi
kwa kutumia sessionId.
Usanifu
Kitega → /v1/chat/completions (apiKeyInfo imetatuliwa katika hatua ya awali)
→ handleChatCore() [open-sse/handlers/chatCore.ts]
→ resolveMemoryOwnerId(apiKeyInfo) # hutoa id
→ getMemorySettings() # mipangilio iliyohifadhiwa kwenye kache
→ shouldInjectMemory(body, {enabled}) # kigezo cha kuruhusu
→ retrieveMemories(apiKeyId, config) # SQL + FTS5 + vekta ya hiari
→ injectMemory(body, memories, provider) # ujumbe wa mfumo au wa mtumiaji
→ mwito kwa mtoa huduma wa nje
→ baada ya jibu: extractFacts(text, apiKeyId, sessionId) # hauzuii utekelezaji
→ setImmediate → createMemory(fact) kwa kila ulinganifu
→ embed(content) + upsertVector(id, vec)
Sehemu za miito ya uingizaji na utoaji zimeunganishwa katika
open-sse/handlers/chatCore.ts (tafuta retrieveMemories, injectMemory,
na extractFacts).
Usanifu wa injini (utatuzi wa ngazi 3)
Injini ya Kumbukumbu hutatua njia ya urejeshaji wakati wa utekelezaji kulingana na miundombinu na mipangilio inayopatikana. Kuna ngazi tatu, zinazotumika kwa mpangilio wa kipaumbele:
┌─────────────────────────────────────────────────────────────┐
│ NGAZI 0 — Neno kuu (FTS5) │
│ Upatikanaji unaotegemea ukaguzi: FTS5 wakati toleo la │
│ SQLite linaiunga mkono (better-sqlite3 / node:sqlite / │
│ bun:sqlite); haipatikani kwenye matoleo yasiyo na FTS5 │
│ (k.m. sql.js/WASM — "no such module: fts5"). Hutumika │
│ wakati strategy = "exact" au kama mbadala; hali ya neno │
│ kuu ya injini huakisi ukaguzi huo. │
└──────────────────────────────────┬──────────────────────────┘
│ strategy = semantic|hybrid?
▼
┌─────────────────────────────────────────────────────────────┐
│ NGAZI 1 — Vekta Iliyopachikwa (sqlite-vec) │
│ sqlite-vec v0.1.9 hupakiwa kupitia db.loadExtension(). │
│ Utafutaji wa moja kwa moja wa KNN kwenye vekta za Float32. │
│ Hufanya kazi wakati: │
│ • sqlite-vec loadExtension inafanikiwa │
│ • Chanzo cha upachikaji kinapatikana (remote | static | │
│ transformers) kinachoweza kutoa Float32Array │
│ • Jedwali la vec_memories lipo (huundwa ready() │
│ inapoitwa kwa mara ya kwanza) │
└──────────────────────────────────┬──────────────────────────┘
│ qdrant.enabled?
▼
┌─────────────────────────────────────────────────────────────┐
│ NGAZI 2 — Qdrant (hifadhidata ya nje ya vekta ya hiari) │
│ Inapowashwa, huchukua nafasi ya sqlite-vec kwa │
│ semantic/hybrid. │
│ Inahitaji programu ya Qdrant inayoendeshwa + host/port │
│ iliyosanidiwa. │
└─────────────────────────────────────────────────────────────┘
Ushushaji wa kiwango hutokea kiotomatiki na kwa uwazi:
- Ikiwa sqlite-vec itashindwa kupakiwa, ngazi ya 1 haipatikani → hutumia ngazi ya 0 kama mbadala.
- Ikiwa chanzo cha upachikaji kitarudisha hitilafu, ngazi ya 1 hutumia ngazi ya 0 kama mbadala.
- Ikiwa Qdrant haifanyi kazi vizuri, ngazi ya 2 hutumia ngazi ya 1 kama mbadala (au ngazi ya 0 ikiwa ngazi ya 1 pia haipatikani).
Vyanzo vya upachikaji
Safu ya upachikaji (src/lib/memory/embedding/) hubainisha chanzo cha kutumia
kulingana na MemorySettingsExtended.embeddingSource:
| Chanzo | Maelezo | Ufunguo unahitajika | Uanzishaji wa kwanza |
|---|---|---|---|
remote |
Hutumia API ya upachikaji ya mtoa huduma aliyesanidiwa (OpenAI, Cohere, n.k.) | Ndiyo | Hakuna |
static |
Upachikaji wa ndani kupitia jedwali la utafutaji la potion-base-8M (WordPiece + ujumuishaji wa wastani) |
Hapana | ~200ms |
transformers |
Utekelezaji wa ONNX wa ndani kupitia @huggingface/transformers v4, all-MiniLM-L6-v2 |
Hapana | ~3s + ~400MB RAM |
auto |
Ubainishaji wakati wa utekelezaji: remote (ikiwa ufunguo upo) → static → transformers → null | Inategemea | Inategemea |
Mpangilio wa ubainishaji kwa auto:
- Tafuta mtoa huduma wa kwanza katika
listEmbeddingProviders()mwenyehasKey === true→remote. - Ikiwa
settings.staticEnabled === true→static. - Ikiwa
settings.transformersEnabled === true→transformers. - Vinginevyo →
null(hushuka hadi utafutaji wa maneno muhimu wa FTS5).
Akiba ya upachikaji (src/lib/memory/embedding/cache.ts) hutumia ramani ya LRU
iliyo ndani ya kumbukumbu, yenye funguo za ${source}:${model}:${dim}:${sha256(text)},
na kikomo cha rekodi MEMORY_EMBEDDING_CACHE_MAX (chaguomsingi 1000), pamoja na
TTL ya MEMORY_EMBEDDING_CACHE_TTL_MS (chaguomsingi dakika 5). Inashirikiwa na
wapigaji wote katika mzunguko wa uhai wa kila mchakato.
RRF mseto (k=60)
Wakati strategy = "hybrid" na hifadhi ya vekta inapatikana, urejeshaji hutumia
Reciprocal Rank Fusion kuunganisha matokeo ya FTS5 na ya vekta:
RRF(d) = Σ 1 / (k + rank_i(d)) ambapo k = 60 (inaweza kusanidiwa kupitia MEMORY_RRF_K)
i
Kwa undani:
- Endesha utafutaji wa FTS5 → orodha iliyopangwa
R_fts(nafasi 1..N). - Endesha utafutaji wa vekta wa KNN → orodha iliyopangwa
R_vec(nafasi 1..M). - Kwa kila
memoryIdya kipekee:
rrf_score = 1/(60 + fts_rank)+1/(60 + vec_rank)(0 ikiwa haimo kwenye orodha). - Panga kwa
rrf_scorekwa mpangilio wa DESC, kisha tumia upitiaji wa bajeti ya tokeni.
RRF inajulikana kuwa na ufanisi bila kuhitaji usawazishaji wa alama kati ya
mifumo tofauti ya urejeshaji. k=60 ya chaguomsingi imetokana na makala ya awali
ya Cormack et al. na hufanya kazi vizuri kwa mikusanyo midogo (<10k kumbukumbu).
Ujazaji wa nyuma (wa polepole + uwekaji upya wa faharasa)
Muundo wa upachikaji unapobadilika (hugunduliwa kupitia embedding_signature),
hifadhi ya vekta huundwa upya na kumbukumbu zote zilizopo huwekewa
needs_reindex = 1 katika jedwali la memories.
Ujazaji wa nyuma wa polepole: Wakati wa urejeshaji unaofuata, kumbukumbu yoyote
isiyo na rekodi ya vekta hupachikwa na kuingizwa katika vec_memories kabla ya
utafutaji kuendeshwa. Hii husambaza gharama ya ujazaji wa nyuma katika maombi
halisi bila kuzuia uanzishaji.
Uwekaji upya wa faharasa wa moja kwa moja: Kichupo cha Engine katika
/dashboard/memory kina kitufe cha "Weka Faharasa Upya Sasa" kinachoita
POST /api/memory/reindex. Kishughulikiaji huita runReindexBatch() kutoka
src/lib/memory/reindex.ts, ambacho huchakata hadi rekodi limit zinazosubiri
kwa kila ombi. Maendeleo yanaweza kukaguliwa mara kwa mara kupitia
GET /api/memory/engine-status (vectorStore.needsReindex).
Jedwali la memory_vec_meta (uhamishaji 083_memory_vec.sql) huhifadhi:
active_dim— kipimo cha sasa cha vekta (null = bado hakijarekebishwa).embedding_signature—${source}:${model}:${dim}inayotumika kugundua mabadiliko.last_reset_at— muhuri wa muda wa uwekaji upya kamili wa mwisho.vec_loaded— alama ya 0/1 inayoonyesha ikiwa sqlite-vec ilipakiwa kwa mafanikio.
Kiendelezi cha mipangilio
Sehemu tisa za embedding na vekta zinapatikana katika MemorySettingsExtended ndani ya
src/shared/schemas/memory.ts, na huhifadhiwa kupitia src/lib/db/settings.ts:
| Sehemu | Aina | Chaguo-msingi | Maelezo |
|---|---|---|---|
embeddingSource |
"remote" | "static" | "transformers" | "auto" |
"auto" |
Chanzo cha embedding kitakachotumika |
embeddingProviderModel |
string | null |
null |
Mtoa huduma/modeli katika muundo wa provider/model |
customBaseUrl |
string | null |
null |
URL msingi ya endpoint inayooana na OpenAI kwa Kumbukumbu pekee |
customModelId |
string | null |
null |
Kitambulisho cha modeli kinachotumwa kwenye endpoint maalum |
transformersEnabled |
boolean |
false |
Hiari ya kutumia Transformers.js (MiniLM, ~400MB) |
staticEnabled |
boolean |
false |
Hiari ya kutumia modeli tuli ya ndani ya potion-base-8M |
rerankEnabled |
boolean |
false |
Washa hatua ya kupanga upya (huongeza +200-500ms/ombi) |
rerankProviderModel |
string | null |
null |
Mtoa huduma/modeli ya upangaji upya katika muundo wa provider/model |
vectorStore |
"sqlite-vec" | "qdrant" | "auto" |
"auto" |
Mfumo wa nyuma wa vekta utakaotumika |
Hizi zinapatikana kupitia GET /PUT /api/settings/memory (schema MemorySettingsExtendedSchema).
Kwa chanzo cha remote, Kumbukumbu pia hukubali mipangilio ya hiari ya customBaseUrl na
customModelId. Kwa pamoja, huchagua endpoint ya /embeddings inayooana na OpenAI
na modeli bila kubadilisha sajili ya kimataifa ya embedding. Endpoint husawazishwa
kabla ya kutumiwa na hukaguliwa na sera ya URL ya nje ya mtoa huduma: HTTP(S)
inahitajika, vitambulisho vilivyopachikwa na mifuatano ya hoja hukataliwa, na anwani
za metadata za wingu huendelea kuzuiwa. Thamani tupu huhifadhi mtoa huduma wa sajili
aliyechaguliwa. Hitilafu zinazorejeshwa kwenye dashibodi husafishwa na vitambulisho
vya endpoint haviwekwi kamwe kwenye kumbukumbu za matukio.
TODO (D20): Upeo wa
global(kushiriki kumbukumbu kwenye funguo zote za API) haujatekelezwa katika toleo hili. Unahitaji mabadiliko ya schema na njia ya urejeshaji ya kimataifa. Ufuatilie kando.
Tabaka za Hifadhi
Msingi: SQLite (jedwali la memories)
Limeundwa na uhamishaji 015_create_memories.sql:
| Safu | Aina | Maelezo |
|---|---|---|
id |
TEXT PRIMARY KEY |
UUID inayozalishwa kupitia crypto.randomUUID() |
api_key_id |
TEXT NOT NULL |
Ufunguo wa API unaomiliki |
session_id |
TEXT |
Upeo wa hiari kwa kila mazungumzo |
type |
TEXT NOT NULL |
Moja kati ya factual, episodic, procedural, semantic |
key |
TEXT |
Ufunguo thabiti wa upsert, k.m. preference:i_prefer_python |
content |
TEXT NOT NULL |
Maandishi halisi ya ukweli |
metadata |
TEXT |
Kifurushi cha JSON (category, extractedAt, source, ...) |
created_at / updated_at |
TEXT |
Mifuatano ya ISO 8601 |
expires_at |
TEXT |
Muda wa hiari wa kuisha; NULL humaanisha ya kudumu |
memory_id |
INTEGER UNIQUE |
Imeongezwa na 023_fix_memory_fts_uuid.sql kuunganisha UUID ↔ rowid za FTS5 |
Indeksi: api_key_id, session_id, type, expires_at, pamoja na indeksi ya kipekee ya
memory_id.
Semantiki za upsert: createMemory() hutafuta safu iliyopo yenye
(api_key_id, key) sawa na kuisasisha hapo hapo inapopatikana (ikiunganisha
metadata kupitia usambazaji wa juu juu). Hii huzuia jedwali kukua bila kikomo
kutokana na kauli za mapendeleo zinazojirudia.
Utafutaji wa Maandishi Kamili (jedwali pepe la memory_fts)
022_add_memory_fts5.sql huunda jedwali pepe la FTS5 juu ya content na
key. 023_fix_memory_fts_uuid.sql hurekebisha hitilafu ya matumizi halisi ambapo
ufunguo msingi wa UUID haukuunganishwa na rowid kamili ya FTS5 — uhamishaji huongeza
safu ya memory_id, huunda upya jedwali la FTS, na huunganisha vichochezi
(memory_fts_ai, memory_fts_ad, memory_fts_au) vinavyoweka FTS katika
ulinganifu wakati wa INSERT, DELETE, na UPDATE.
Hutumiwa na retrieval.ts kwa mikakati ya semantic na hybrid (tazama hapa chini).
Msimbo wa urejeshaji hulinda kwa kutumia hasTable("memory_fts") na hurudi kwenye
mpangilio wa wakati ikiwa jedwali la FTS halipo au hoja ya FTS inaleta hitilafu.
Hiari: Qdrant (hifadhi ya vekta ya kiwango cha 2)
src/lib/memory/qdrant.ts hutekeleza muunganisho wa hiari wa Qdrant kama hifadhi ya
vekta ya kiwango cha 2. Urejeshaji huelekezwa kwa Qdrant tu wakati kiteuzi cha injini
memoryVectorStore === "qdrant" — chaguo-msingi "auto" (na "sqlite-vec")
kamwe havichagui Qdrant. Kitufe cha kuwasha/kuzima cha kichupo cha Engine huweka
zote mbili, qdrantEnabled na memoryVectorStore, kwa pamoja: kuwasha hufanya
Qdrant kuwa hifadhi msingi, na kuzima hurudisha kuwa "auto" (#5597 — kabla ya
marekebisho hayo, kuwasha hakukuwa na athari kwa sababu hakuna kitu kilichoandika
kiteuzi cha injini). Ikiwa Qdrant haipatikani au hairudishi chochote, urejeshaji
hurudi kwenye sqlite-vec → FTS5.
upsertSemanticMemoryPoint()— hupachikakey + contentkwa kutumia modeli ya upachikaji iliyosanidiwa, huhakikisha mkusanyiko upo (huunda vekta za umbali wa kosaini inapotumika kwa mara ya kwanza), na huingiza au kusasisha pointi yenye payload{memoryId, apiKeyId, sessionId, key, content, metadata, createdAtUnix, expiresAtUnix}.searchSemanticMemory(query, topK, scope)— hupachika hoja, hutafuta kwenye mkusanyiko uliochujwa kwakind = "omniroute_memory"na, kwa hiari, kwaapiKeyId/sessionId. Huweka kikomo chatopKkuwa[1, 20].deleteSemanticMemoryPoint(id)— hufuta pointi moja. Huitwa nadeleteMemory()baada ya safu ya SQLite kuondolewa (D15).cleanupSemanticMemoryPoints({retentionDays})— hufuta kwa pamoja pointi ambazoexpiresAtUnixyake imepita au ambazocreatedAtUnixyake ni ya zamani kuliko kikomo cha uhifadhi. Huhesabu kwanza ili dashibodi iweze kuonyesha idadi halisi.checkQdrantHealth()— kipimo cha afya chaGET /readyzpamoja na muda wa kusubiri.
Kiolesura cha mipangilio kinaonyesha usanidi wa Qdrant, ukaguzi wa afya, jaribio la utafutaji wa kisemantiki,
na usafishaji katika kichupo cha Engine cha /dashboard/memory. Njia zinazohusiana
chini ya src/app/api/settings/qdrant/ zote zimeunganishwa kuanzia v3.8.6:
| Njia | Mbinu | Maelezo |
|---|---|---|
/api/settings/qdrant |
GET / PUT |
Soma / sasisha mipangilio ya Qdrant |
/api/settings/qdrant/health |
GET |
Kipimo cha uhai + muda wa kusubiri |
/api/settings/qdrant/search |
POST |
Jaribio la utafutaji wa kisemantiki |
/api/settings/qdrant/cleanup |
POST |
Ondoa pointi zilizokwisha muda / za zamani |
/api/settings/qdrant/embedding-models |
GET |
Orodhesha modeli za upachikaji zinazopatikana |
Maelezo ya tabia (unachopaswa kutarajia):
- Uteuzi wa injini — kuwezesha Qdrant katika kichupo cha Engine huifanya kuwa hifadhi kuu
(huweka
memoryVectorStore="qdrant"); kuizima hurejesha kuwa"auto"(#5597). - Hakuna ujazaji wa data za awali — ni kumbukumbu zilizoundwa/kusasishwa baada ya Qdrant kuwezeshwa pekee ndizo zinazoandikwa humo (uandishi wa hifadhi mbili usiosubiri matokeo). Kumbukumbu zilizokuwapo awali katika SQLite hazihamishwi; "Reindex Now" huunda upya faharasa ya sqlite-vec pekee, si Qdrant.
- Kipimo cha vekta hutambuliwa kiotomatiki kutoka kwenye upachikaji halisi wakati wa matumizi ya kwanza — hakuna sehemu ya kipimo ya kujaza. Kubadilisha modeli ya upachikaji baada ya mkusanyiko kuwepo hakushughulikiwi kiotomatiki: mkusanyiko uliopo huachwa bila kubadilishwa, na uandishi/utafutaji wenye vipimo visivyolingana hushindwa na kurejea kwa sqlite-vec. Unda mkusanyiko upya (jina jipya, au uufute katika Qdrant) ili kubadilisha modeli ya upachikaji.
- Metriki ya umbali — daima ni Cosine (imewekwa moja kwa moja wakati wa kuunda mkusanyiko; haiwezi kusanidiwa).
- Uthibitishaji — ufunguo wa API pekee (hutumwa kama kichwa cha
api-key; ni wa hiari kwa Docker ya ndani isiyotumia uthibitishaji). JWT/RBAC hazitumiki. - Sehemu za usanidi — kiolesura kinaonyesha
host,port,collection,embeddingModel,apiKey.vectorSize/hnswEfConstructni za mazingira/DB pekee navectorSizehaitumiki kuunda mkusanyiko (kipimo hutokana na upachikaji).
Ukadiriaji wa vekta (int8 — wa hiari, mifumo yote miwili)
Mifumo yote miwili ya vekta inasaidia ukadiriaji wa int8 wa hiari ili kupunguza kumbukumbu inayotumiwa na vekta zilizohifadhiwa (~ndogo mara 4 kuliko Float32) kwa gharama ndogo ya uwezo wa kurejesha matokeo. Kwa chaguo-msingi, kipengele hiki kimezimwa kwenye mifumo yote miwili — vekta hubaki na usahihi kamili isipokuwa kikiwezeshwa waziwazi.
| Mfumo | Mpangilio | Aina | Chaguo-msingi | Mahali inaposomwa |
|---|---|---|---|---|
| Qdrant | qdrantQuantization (ufunguo wa DB) |
"none" | "int8" | "binary" |
"none" |
src/lib/memory/qdrant.ts::normalizeQdrantConfig() |
| sqlite-vec | MEMORY_VEC_QUANTIZATION (mazingira) |
"none" | "int8" |
"none" |
src/lib/memory/vectorStore.ts::requestedVecQuantization() |
- Qdrant husanidiwa kwa kila instansi kupitia ufunguo wa mpangilio wa
qdrantQuantization(unaoonyeshwa kama sehemu yaquantizationkwenyePUT /api/settings/qdrant). Wakati ni"int8",buildQuantizationConfig()huomba ukadiriaji wa skala (always_ram, kantili0.99) na utafutaji huwezesharescore: trueili vekta za usahihi kamili ziboreshe seti ya matokeo tarajiwa ya int8. - Ukadiriaji wa sqlite-vec ni wa mazingira pekee (si mpangilio wa DB): weka
MEMORY_VEC_QUANTIZATION=int8ili kuhifadhi vekta za ndani kama safu wima yaint8[dim]kupitiavec_quantize_int8(?, 'unit'). Hali iliyochaguliwa hujumuishwa kwenyeembedding_signature(kiambishi tamati cha:int8), kwa hivyo kubadilisha hali husababisha uundaji upya kamili wa faharasa ya jedwali lavec_memories— njia ileile ya kujaza data za awali polepole inayotumika wakati modeli ya upachikaji inapobadilika.
Aina za Kumbukumbu
MemoryType (src/lib/memory/types.ts):
| Aina | Hutumika kwa |
|---|---|
factual |
Mapendeleo, taarifa thabiti za mtumiaji, mifumo ya tabia |
episodic |
Maamuzi yanayohusishwa na wakati mahususi ("Nilichagua Postgres") |
procedural |
Kumbukumbu ya mtiririko wa kazi / jinsi ya kufanya (imehifadhiwa; kwa sasa hakuna kichopozi kiotomatiki) |
semantic |
Imehifadhiwa kwa maingizo ya hifadhi ya vekta |
Mkakati wa urejeshaji wa MemoryConfig ni mojawapo ya exact, semantic, au hybrid,
na upeo ni mojawapo ya session, apiKey, au global. Upeo chaguo-msingi kutoka
getMemorySettings() ni apiKey.
Utopoaji wa Taarifa (extraction.ts)
Utopoaji unategemea regex, si LLM — huendeshwa ndani ya mchakato kwa
setImmediate() ili kamwe usizuie mtiririko wa jibu:
- Mifumo ya mapendeleo →
MemoryType.FACTUAL(k.m.Napendelea …,Ninapenda sana …,ninachopenda zaidi ni …,Nachukia …) - Mifumo ya maamuzi →
MemoryType.EPISODIC(k.m.Nitatumia …,Nilichagua …,Niliamua kutumia …,Nitapitisha …) - Mifumo ya tabia →
MemoryType.FACTUAL(k.m.Kwa kawaida mimi …,Daima mimi …,Mimi huwa …)
Kila ulinganifu husafishwa (trim, kuunganisha nafasi tupu, na kuwekewa kikomo cha herufi 500),
huondolewa nakala ndani ya kundi kupitia factKey(category, content) thabiti, na
huhifadhiwa kupitia createMemory() ikiwa na metadata
{category, extractedAt, source: "llm_response"}. Maandishi ya ingizo yanawekewa kikomo cha
64 KiB (MAX_EXTRACTION_TEXT_LENGTH) — yanapokuwa marefu zaidi, sehemu ya mwisho ya maandishi
hutumika ili maudhui ya hivi karibuni zaidi ya msaidizi yashirikishwe kila wakati.
extractFactsFromText(text) husafirishwa kwa ajili ya majaribio na hurudisha taarifa
zilizopangwa bila kuzihifadhi.
Urejeshaji (retrieval.ts)
retrieveMemories(apiKeyId, config) ndiyo sehemu kuu ya kuingilia. Hufanya yafuatayo:
- Husawazisha na kuthibitisha usanidi kupitia
MemoryConfigSchema. - Hurudisha
[]mara moja wakatienabledni false aumaxTokens <= 0. - Huweka
maxTokensndani ya masafa ya[1, 8000]. - Hutambua iwapo jedwali la kisasa la
memorieslipo (dhidi ya jedwali la zamani lamemory) ili hifadhidata za zamani ziendelee kufanya kazi. - Huunda hoja msingi yenye kinga ya muda wa kuisha
(
expires_at IS NULL OR datetime(expires_at) > datetime('now')), upeo wa hiari wa kipindi, na kikomo cha hiari charetentionDays. - Hugawanyika kulingana na mkakati:
exact(chaguo-msingi): mpangilio wa mfuatano wa mudaORDER BY created_at DESC LIMIT 100.semantic: ikiwaconfig.querynamemory_ftszipo, hutumia JOIN yamemory_fts MATCH ?na kupanga kulingana na nafasi ya FTS; hurudi kwenye mpangilio wa mfuatano wa muda wakati FTS inarudisha safu 0.hybrid: muungano wa matokeo ya FTS (umuhimu wa juu zaidi) na seti ya mfuatano wa muda, huku nakala zikiondolewa kwa id.
- Hukokotoa alama ya umuhimu wa maneno muhimu (
getRelevanceScore) katikacontent,key, na JSON yametadatawakati hoja imetolewa. Safu zenye alama sifuri huchujwa. - Hupanga kwa alama kwa mpangilio wa kushuka, kisha
createdAtkwa mpangilio wa kushuka. - Hupitia orodha iliyopangwa na kukubali maingizo mradi jumla inayoendelea ya
estimateTokens(content)(≈length / 4) ibaki chini ya bajeti. Daima hurudisha angalau ingizo moja wakati kuna ulinganifu wowote.
estimateTokens husafirishwa na kutumiwa na urejeshaji, ufupishaji, na zana ya MCP ya
omniroute_memory_search.
Uingizaji (injection.ts)
injectMemory(request, memories, provider):
- Huunganisha maudhui yote ya kumbukumbu kuwa mfuatano mmoja wa
Memory context: …. - Huchagua mkakati kulingana na jina la mtoa huduma:
- Ujumbe wa mfumo (chaguo-msingi kwa OpenAI, Anthropic, Gemini, …) — huongeza
{role: "system", content: memoryText}mwanzoni kabla ya ujumbe wowote uliopo wa mfumo ili vidokezo vya mfumo vya mtumiaji viendelee kupewa kipaumbele. - Ujumbe wa mtumiaji (chaguo la akiba) — kwa watoa huduma walio katika
PROVIDERS_WITHOUT_SYSTEM_MESSAGE:o1,o1-mini,o1-preview,glm,glmt,glm-cn,zai,qianfan. Hawa hukataa jukumu la mfumo na vinginevyo wangerejesha 400 (taz. suala #1701 la GLM/Zhipu).
- Ujumbe wa mfumo (chaguo-msingi kwa OpenAI, Anthropic, Gemini, …) — huongeza
- Hurekodi idadi, mkakati na modeli chini ya
memory.injection.injected.
providerSupportsSystemMessage(provider) husafirishwa kwa wapigaji wanaohitaji
kufanya maamuzi yao wenyewe ya uelekezaji. Watoa huduma wasiojulikana hutumia true
(jukumu la mfumo linaruhusiwa) kama chaguo-msingi kwa usalama.
Mipangilio (settings.ts)
Usanidi wa kumbukumbu huhifadhiwa katika jedwali la mipangilio la DB, si katika vigezo vya mazingira.
getMemorySettings() husoma kutoka getSettings() na huhifadhi matokeo katika kache
ndani ya mchakato; invalidateMemorySettingsCache() huitwa na njia ya PUT ya mipangilio
baada ya uandishi.
Sehemu za zamani (matoleo yote)
| Ufunguo wa DB | Aina | Chaguo-msingi | Kidhibiti cha UI |
|---|---|---|---|
memoryEnabled |
boolean | false (imezimwa kwa chaguo-msingi tangu v3.8.30) |
Kuwasha/kuzima kumbukumbu |
memoryMaxTokens |
integer | 2000 (masafa 0–16000) |
Bajeti ya tokeni za uingizaji |
memoryRetentionDays |
integer | 30 (masafa 1–365) |
Kipindi cha kuhifadhi |
memoryStrategy |
enum | "hybrid" (moja ya recent, semantic, hybrid) |
Mkakati wa urejeshaji |
skillsEnabled |
boolean | false |
Huwasha au kuzima uingizaji wa ujuzi kwa kila ufunguo (tazama SKILLS.md) |
Kumbuka: mkakati wa UI "recent" hulingana na mkakati wa ndani wa urejeshaji
"exact" kupitia toMemoryRetrievalConfig() (mpangilio wa kikronolojia).
Sehemu mpya (v3.8.6, mpango 21 D9)
Tazama pia sehemu ya "Kiendelezi cha mipangilio" hapo juu kwa maelezo ya sehemu.
| Ufunguo wa DB | Sehemu ya API | Chaguo-msingi |
|---|---|---|
memoryEmbeddingSource |
embeddingSource |
"auto" |
memoryEmbeddingModel |
embeddingProviderModel |
null |
memoryTransformersEnabled |
transformersEnabled |
false |
memoryStaticEnabled |
staticEnabled |
false |
memoryRerankEnabled |
rerankEnabled |
false |
memoryRerankModel |
rerankProviderModel |
null |
memoryVectorStore |
vectorStore |
"auto" |
Funguo za DB zinazohusiana na Qdrant (qdrantEnabled, qdrantHost, qdrantPort,
qdrantApiKey, qdrantCollection yenye chaguo-msingi "omniroute_memory",
qdrantEmbeddingModel yenye chaguo-msingi "openai/text-embedding-3-small") husomwa na
normalizeQdrantConfig() katika qdrant.ts.
Vigezo vya mazingira (v3.8.6)
Vigezo sita vya mazingira vya hiari hurekebisha tabia ya injini wakati wa utekelezaji (vimeandikwa katika .env.example):
| Kigezo | Chaguo-msingi | Maelezo |
|---|---|---|
MEMORY_EMBEDDING_CACHE_TTL_MS |
300000 |
TTL ya kache ya upachikaji (dakika 5) |
MEMORY_EMBEDDING_CACHE_MAX |
1000 |
Idadi ya juu zaidi ya vipengee katika kache ya LRU ya upachikaji |
MEMORY_TRANSFORMERS_MODEL |
Xenova/all-MiniLM-L6-v2 |
Hazina ya HF ya modeli ya Transformers.js |
MEMORY_STATIC_MODEL |
minishlab/potion-base-8M |
Hazina ya HF ya modeli tuli ya potion |
MEMORY_STATIC_CACHE_DIR |
<DATA_DIR>/embeddings |
Mahali pa kuhifadhi modeli zilizopakuliwa |
MEMORY_VEC_TOP_K |
20 |
Top-K ya chaguo-msingi kwa utafutaji wa vekta |
MEMORY_RRF_K |
60 |
Konstanti ya RRF k kwa utafutaji mseto |
MEMORY_VEC_QUANTIZATION |
none |
Weka kuwa int8 ili kuhifadhi vekta za ndani za sqlite-vec zilizokwantishwa (~ndogo mara 4; ni hiari). Kubadilisha modi hulazimisha uundaji upya wa faharasa. |
Ufupishaji (summarization.ts)
summarizeMemories(apiKeyId, sessionId?, maxTokens = 4000) hubana maudhui ya zamani
wakati jumla inayoendelea ya tokeni katika kumbukumbu za ufunguo inapozidi
kikomo. Hupitia safu kwa mpangilio wa DESC kulingana na created_at, huhifadhi safu zinazotoshea, na kwa
zilizosalia hubadilisha content papo hapo kwa sentensi tatu za kwanza za
maudhui asili. tokensSaved ni tofauti ya estimateTokens kati ya maudhui ya
zamani na mapya.
Utaratibu huu unapatikana lakini hauitwi kiotomatiki katika mtiririko wa sasa wa
gumzo — uite kutoka kwenye cron, kitendo cha msimamizi, au kiunganishi cha
MemoryConfig.autoSummarize ikiwa unahitaji ubanaji endelevu. Upotevu wa data
ni wa njia moja: maandishi asili yanaandikwa juu.
API ya REST
Endpoint zote zinahitaji uthibitishaji wa usimamizi (requireManagementAuth).
Endpoint za msingi za kumbukumbu (zilizopo + zilizosasishwa)
| Mbinu | Njia | Maelezo |
|---|---|---|
GET |
/api/memory |
Orodha iliyogawanywa katika kurasa yenye vichujio: apiKeyId, type, sessionId, q, limit, page, offset. Jibu linajumuisha stats.total, stats.tokensUsed, stats.hitRate, cacheStats |
POST |
/api/memory |
Unda ingizo (lililothibitishwa na Zod: content, key, type ya hiari, sessionId, apiKeyId, metadata, expiresAt). Huita createMemory() ambayo hufanya upsert kwenye (apiKeyId, key) |
GET |
/api/memory/[id] |
Leta ingizo moja kwa UUID |
PUT |
/api/memory/[id] |
Sasisha sehemu za ingizo (type, key, content, metadata). Mwili: MemoryUpdatePutSchema. Pia husawazisha vekta ikiwa chanzo cha embedding kinapatikana. |
DELETE |
/api/memory/[id] |
Futa ingizo; pia hufuta kutoka vec_memories (D15) na Qdrant kwa kadiri iwezekanavyo. Hurejesha 404 likikosekana. |
GET |
/api/memory/health |
Huendesha verifyExtractionPipeline("health-check") — mzunguko kamili wa unda→orodhesha→futa. Hurejesha {working, latencyMs, error?} |
Endpoint mpya za injini ya kumbukumbu (mpango wa 21)
| Mbinu | Njia | Maelezo |
|---|---|---|
POST |
/api/memory/retrieve-preview |
Uendeshaji wa majaribio wa retrieveMemories — hurejesha matokeo yaliyopangwa kwa alama, kiwango na tokeni. Mwili: RetrievePreviewSchema. HAIINGIZI wala kubadilisha kumbukumbu. |
GET |
/api/memory/embedding-providers |
Huorodhesha watoa huduma pamoja na modeli za embedding, ikionyesha ni zipi zina ufunguo wa API uliosanidiwa. |
GET |
/api/memory/engine-status |
Hurejesha hali kamili ya injini: kiwango cha maneno muhimu, utatuzi wa embedding, takwimu za hifadhi ya vekta, afya ya Qdrant na usanidi wa upangaji upya. Muundo: MemoryEngineStatusSchema. |
POST |
/api/memory/summarize |
Anzisha ubanaji wa kumbukumbu kwa mikono. Mwili: MemorySummarizeSchema (olderThanDays, apiKeyId?, dryRun). Hurejesha {candidates, tokensSaved}. |
POST |
/api/memory/reindex |
Anzisha uundaji upya wa faharasa ya vekta kwa kumbukumbu zenye needs_reindex=1. Mwili: MemoryReindexSchema (force). Hurejesha {started, pending}. |
Endpoint za mipangilio
| Mbinu | Njia | Maelezo |
|---|---|---|
GET |
/api/settings/memory |
MemorySettingsExtended ya sasa iliyosawazishwa (sehemu 7 mpya + za zamani) |
PUT |
/api/settings/memory |
Sasisha sehemu yoyote kutoka MemorySettingsExtendedSchema (jumla ya sehemu 12) |
GET |
/api/settings/qdrant |
Mipangilio ya sasa ya Qdrant (QdrantSettingsSchema) |
PUT |
/api/settings/qdrant |
Sasisha mipangilio ya Qdrant. Mwili: QdrantSettingsUpdateSchema. apiKey = mfuatano tupu huondoa ufunguo. |
GET |
/api/settings/qdrant/health |
Uchunguzi wa upatikanaji dhidi ya instance ya Qdrant iliyosanidiwa. Hurejesha QdrantHealthResultSchema. |
POST |
/api/settings/qdrant/search |
Jaribio la utafutaji wa kisemantiki dhidi ya Qdrant. Mwili: QdrantSearchSchema (query, topK). |
POST |
/api/settings/qdrant/cleanup |
Ondoa pointi za Qdrant za kumbukumbu zilizokwisha muda / za zamani. |
GET |
/api/settings/qdrant/embedding-models |
Orodhesha modeli za embedding zinazopatikana kwa Qdrant. |
Hoja ya orodha ya /api/memory inatumia ama ugawaji katika kurasa unaotegemea page
(parsePaginationParams) au offset ghafi — offset inapokuwepo,
hupewa kipaumbele na page inayotokana nayo huhesabiwa kwa ajili ya muundo wa jibu.
Zana za MCP (open-sse/mcp-server/tools/memoryTools.ts)
Seva ya MCP inapowashwa, zana tatu za kumbukumbu husajiliwa:
omniroute_memory_search—{apiKeyId, query?, type?, maxTokens?, limit?}→ hufunikaretrieveMemories(). Kuanzia v3.8.6 (D16),strategyhusomwa kutokagetMemorySettings()badala ya kuwekwa moja kwa moja kuwa"exact". Ikiwaqueryimetolewa nastrategynisemanticauhybrid, hifadhi ya vekta hutumika inapopatikana.omniroute_memory_add—{apiKeyId, sessionId?, type, key, content, metadata?}→ hufunikacreateMemory(). Hukubali aina 4 rasmi pekee:factual,episodic,procedural,semantic(D17).omniroute_memory_clear—{apiKeyId, type?, olderThan?}→ huorodhesha rekodi zinazolingana, kwa hiari huchuja kwa muhuri wa muda wa kuundwa kabla ya muda fulani, kisha hufuta kila moja kupitiadeleteMemory()(ambayo pia huondoa vekta kutoka sqlite-vec + Qdrant).
Tazama MCP-SERVER.md kwa maelezo ya usafirishaji na upeo.
Dashibodi (Studio ya Kumbukumbu)
src/app/(dashboard)/dashboard/memory/page.tsx sasa ni Studio yenye vichupo 3:
Kichupo: Kumbukumbu
- Kadi ya dhana (maelezo ya "Jinsi inavyofanya kazi" yanayoweza kukunjwa).
- Orodha ya wakati halisi, utafutaji na ugawaji wa kurasa (ucheleweshaji wa ms 300).
- Kichujio cha aina (
factual/episodic/procedural/semantic/ zote). - Dirisha la kuongeza kumbukumbu (ufunguo, maudhui, aina).
- Uhariri wa moja kwa moja (kitufe cha penseli →
PUT /api/memory/[id]). - Kufuta kila safu (pamoja na kisanduku cha uthibitishaji).
- Uhamishaji wa ukurasa wa sasa kama JSON; uingizaji wa JSON kupitia kichagua faili.
- Kadi za takwimu:
totalEntries,tokensUsed,hitRate. - Kitufe cha "Fupisha za zamani" →
POST /api/memory/summarize(utekelezaji wa majaribio kwanza huonyesha idadi ya rekodi zinazofaa, kisha huomba uthibitisho). - Nukta ya kijani/nyekundu ya hali inayoendeshwa na
GET /api/memory/health.
Kichupo: Eneo la Majaribio
- Sehemu ya kuingiza hoja + kichagua mkakati (Halisi / Kisemantiki / Mseto) + kikomo cha tokeni.
- "Iga" →
POST /api/memory/retrieve-preview— huonyesha matokeo yaliyopangwa pamoja nascore,tier,tokens,vecScore,ftsScore. - Paneli ya utatuzi inayoonyesha chanzo cha upachikaji / hifadhi ya vekta iliyotumika na ikiwa mbinu mbadala ilitumika.
Kichupo: Injini
- Paneli ya hali ya injini (kiashiria cha neno muhimu la FTS5, kiashiria cha upachikaji, kiashiria cha hifadhi ya vekta, kiashiria cha afya ya Qdrant, kiashiria cha upangaji upya).
- Kitufe cha "Weka Faharasa Upya Sasa" →
POST /api/memory/reindex. - Kichagua chanzo cha upachikaji (kiotomatiki / cha mbali / tuli / transformers + vigeuzi).
- Kadi ya usanidi wa Qdrant (kigeuzi cha kuwezesha, seva mlango/mkusanyiko/ufunguo, jaribio la muunganisho, jaribio la utafutaji wa kisemantiki, usafishaji).
- Kadi ya usanidi wa upangaji upya (kigeuzi cha kuwezesha, kichagua mtoa huduma/muundo).
Mipangilio ya Kumbukumbu na Qdrant pia inapatikana chini ya
/dashboard/settings → Memory & Skills (MemorySkillsTab.tsx) kwa
kiolesura cha mipangilio ya zamani/ya jumla.
Uakibishaji
src/lib/memory/store.ts hudumisha akiba inayokaribia LRU ndani ya mchakato
(MEMORY_CACHE_TTL = 1 min, MEMORY_MAX_CACHE_SIZE = 500, huku 20 %
ya rekodi za zamani zaidi zikiondolewa) kwa usomaji wa getMemory(id), pamoja na safu ya jumla ya ufunguo/thamani ya
memoryCache (src/lib/memory/cache.ts) yenye mbinu za get/set/invalidate
zinazotumiwa na wapigaji wanaotaka akiba yao wenyewe yenye upeo maalum (LRU ya rekodi 1 000,
TTL chaguomsingi ya dakika 5).
Faragha na Mzunguko wa Maisha
- Umiliki wa kumbukumbu ni kitambulisho cha ufunguo wa API (
resolveMemoryOwnerIdkatikachatCore.ts). BilaapiKeyInfo.id, urejeshaji, udungaji, wala uchimbaji hautekelezwi. - Maingizo yenye
expires_atya wakati ujao huchujwa kutoka kwenye urejeshaji; maingizo ya zamani yanayozidiretentionDayshuondolewa na kisharti chacreated_at >= cutoffkatikaretrieveMemories. - Kwa ufutaji wa kudumu, tumia
DELETE /api/memory/[id]auomniroute_memory_clear. - Uchimbaji huanzishwa bila kusubiri matokeo kupitia
setImmediate; hitilafu huandikwa kwenye kumbukumbu chini yamemory.extraction.background.failedna kamwe hazionyeshwi kwa mpigaji. - Mizunguko ya uthibitishaji (
verifyExtractionPipeline) husafisha maingizo yake yenyewe ya majaribio katika kizuizi chafinally.
Tazama Pia
- SKILLS.md — mpangilio wa
skillsEnabledhudunga ufafanuzi wa zana pamoja na kumbukumbu. - MCP-SERVER.md — usafirishaji / mawanda ya MCP.
- API_REFERENCE.md — eneo pana zaidi la API.
- Moduli za chanzo:
src/lib/memory/types.ts,schemas.tssrc/lib/memory/store.ts,retrieval.ts,injection.ts,reindex.tssrc/lib/memory/extraction.ts,summarization.ts,verify.tssrc/lib/memory/settings.ts,qdrant.ts,cache.tssrc/lib/memory/vectorStore.ts— sqlite-vec + RRF msetosrc/lib/memory/embedding/index.ts— safu ya upachikaji yenye vyanzo vingisrc/lib/memory/embedding/types.ts,remote.ts,staticPotion.ts,transformersLocal.ts,cache.tssrc/shared/schemas/memory.ts— skima za Zod kwa miili yote ya API ya kumbukumbusrc/shared/schemas/qdrant.ts— skima za Zod kwa mipangilio/operesheni za Qdrantsrc/lib/db/memoryVec.ts— CRUD yamemory_vec_metasrc/lib/db/migrations/015_create_memories.sql,022_add_memory_fts5.sql,023_fix_memory_fts_uuid.sql,083_memory_vec.sqlsrc/app/api/memory/route.ts,[id]/route.ts,health/route.tssrc/app/api/memory/retrieve-preview/route.tssrc/app/api/memory/engine-status/route.tssrc/app/api/memory/embedding-providers/route.tssrc/app/api/memory/summarize/route.tssrc/app/api/memory/reindex/route.tssrc/app/api/settings/memory/route.tssrc/app/api/settings/qdrant/route.ts+ njia ndogosrc/app/(dashboard)/dashboard/memory/— Kiolesura cha Studio (ukurasa + vijenzi + vichupo + hooks)open-sse/handlers/chatCore.ts(muunganisho wa udungaji / uchimbaji)open-sse/mcp-server/tools/memoryTools.ts
Kuchagua Mtoa Huduma wa Upachikaji (v3.8.16+)
Injini ya kumbukumbu ya OmniRoute inatumia vyanzo vinne vya upachikaji (src/lib/memory/embedding/). Kila kimoja kina uwiano tofauti katika ukawiaji, gharama, ubora wa modeli, na utata wa usanidi.
Vyanzo vya Upachikaji
| Mtoa huduma | Chanzo | Ukawiaji | Gharama | Ubora | Usanidi |
|---|---|---|---|---|---|
transformers |
Modeli ya ndani ya ONNX (Xenova/all-MiniLM-L6-v2) | ~50-150ms (CPU) | Bila malipo | Mzuri | npm install pekee |
static |
Vekta zilizokokotolewa mapema (zilizohifadhiwa kwenye kache) | <1ms | Bila malipo | Haitumiki (hutegemea kupatikana kwenye kache) | Hakuna |
remote |
API ya OpenAI / Cohere / Voyage | ~100-300ms | $0.02-0.10/1M tokeni | Bora sana | Ufunguo wa API |
auto |
Huchagua chanzo bora kinachopatikana wakati wa utekelezaji | Sawa na chanzo kilichochaguliwa | Bila malipo | Sawa na chanzo kilichochaguliwa | Hakuna |
| (cache) | Safu ya LRU ya ndani ya kumbukumbu juu ya chanzo chochote | <1ms (ikipatikana), ukawiaji kamili (isipopatikana) | Bila malipo | Sawa na chanzo cha msingi | Huwa imewashwa kila wakati (si chanzo kinachoweza kuchaguliwa) |
Mti wa Maamuzi
Muktadha wako wa upelekaji ni upi?
│
┌───────────┼───────────┬──────────────┐
│ │ │ │
UUNDaji/JARIBIO UZALISHAJI MDOGO UZALISHAJI MKUBWA UKINGO / NJE YA MTANDAO
│ │ │ │
▼ ▼ ▼ ▼
transformers transformers remote (Qdrant) transformers
(bila malipo, hakuna API) (ubora bora) (hakuna intaneti)
│ │ │ │
└────────┬──┴───────────┴──────────────┘
│
▼
DAIMA ongeza safu ya `cache` juu
(`LruCache` hufunika mtoa huduma yeyote)
Usanidi wa Hifadhidata na API
Chaguo za upachikaji wa kumbukumbu husanidiwa kupitia API/Kiolesura cha Mipangilio, si vigeu vya mazingira. Funguo husika za hifadhidata ya mipangilio chini ya Mipangilio (normalizeMemorySettings katika src/lib/memory/settings.ts) ni:
memoryEmbeddingSource:"transformers"(ya ndani),"remote"(inayotumia API, k.m. OpenAI),"static"(hifadhi ya nje), au"auto"memoryEmbeddingProviderModel: Kitambulisho cha modeli kwa vyanzo vya remote/static (k.m.,"text-embedding-3-small")memoryTransformersEnabled:true|falsememoryStaticEnabled:true|falsememoryVectorStore:"sqlite-vec","qdrant", au"auto"
Modeli ya Ndani (transformers)
Hutumia transformers.js ndani yake kuendesha modeli za ndani:
# Vigeu vya mazingira vinavyosomwa katika msimbo (src/lib/memory/embedding/index.ts):
MEMORY_TRANSFORMERS_MODEL=Xenova/all-MiniLM-L6-v2 # Hazina ya modeli ya HF
MEMORY_STATIC_MODEL=minishlab/potion-base-8M # Modeli tuli ya potion ya HF
MEMORY_STATIC_CACHE_DIR=<DATA_DIR>/embeddings # Saraka ya kache
Kache ya Upachikaji ya LRU
Kache huwashwa kila wakati kwa chaguo-msingi na husanidiwa kupitia vigeu vya mazingira:
MEMORY_EMBEDDING_CACHE_MAX=1000 # Idadi ya juu zaidi ya vipengee vilivyohifadhiwa kwenye kache
MEMORY_EMBEDDING_CACHE_TTL_MS=300000 # TTL (dakika 5)
Vipimo vya Utendaji
Kipimo linganishi kwenye seva ya kawaida ya x86 yenye viini 4 (maandishi yenye takriban tokeni 100 kila moja):
| Mtoa huduma | p50 | p95 | p99 | Gharama / embeddings milioni 1 |
|---|---|---|---|---|
transformers (CPU) |
80ms | 180ms | 350ms | Bila malipo |
remote (OpenAI) |
120ms | 220ms | 400ms | ~$0.02 (ada-002) / $0.13 (3-large) |
static (Qdrant) |
15ms | 30ms | 60ms | Inategemea upangishaji wa Qdrant |
cache (imepatikana) |
<1ms | <1ms | 2ms | Bila malipo |
Mifumo ya Uchimbaji wa Taarifa (v3.8.16+)
Moduli ya extraction.ts (src/lib/memory/extraction.ts) hutumia ulinganishaji wa mifumo ya regex ili kuchimba taarifa zilizopangwa kutoka kwenye ujumbe wa mazungumzo. Kuelewa mifumo hii hukusaidia kuboresha ubora wa uchimbaji kwa hali yako ya matumizi.
Kategoria Chaguo-msingi za Mifumo
| Kategoria | Mfano wa mfumo | Kinachonaswa |
|---|---|---|
| PREFERENCE_PATTERNS | "Ninapendelea <X>", "Ninapenda <X>", "Ninachukia <X>" |
Mapendeleo ya mtumiaji |
| DECISION_PATTERNS | "Nitatumia <X>", "Niliamua <X>", "Nilichagua <X>" |
Maamuzi ya mtumiaji (kiepisodi) |
| PATTERN_PATTERNS | "Kwa kawaida <X>", "Daima <X>", "Kamwe <X>" |
Mifumo endelevu ya tabia |
Mifano ya Mifumo (Imerahisishwa)
// Kutoka src/lib/memory/extraction.ts
const PREFERENCE_PATTERNS = [
/\bI\s+(?:really\s+)?prefer\s+([^.,\n]+)/gi,
/\bI\s+(?:really\s+)?like\s+([^.,\n]+)/gi,
/\bI\s+(?:hate|dislike|avoid)\s+([^.,\n]+)/gi,
];
const DECISION_PATTERNS = [
/\bI'?(?:ll|will)\s+use\s+([^.,\n]+)/gi,
/\bI\s+(?:have\s+)?decided\s+(?:to\s+)?([^.,\n]+)/gi,
];
const PATTERN_PATTERNS = [/\bI\s+usually\s+([^.,\n]+)/gi, /\bI\s+always\s+([^.,\n]+)/gi];
Kinachochimbwa
Mtumiaji anaposema:
"Ninapendelea TypeScript. Nitatumia Postgres kwa mradi huu. Daima nafanya commit kabla ya push. Sipendi Python." Uchimbaji hutoa kumbukumbu 4:
Ufunguo Kategoria Aina Maudhui preference:typescriptmapendeleo taarifa "TypeScript" decision:postgres_for_this_projectuamuzi kiepisodi "Postgres kwa mradi huu" pattern:commit_before_pushingmfumo taarifa "commit kabla ya push" preference:pythonmapendeleo taarifa "Python"
Vikomo vya Uchimbaji
Ili kuzuia uchimbaji usiodhibitiwa, vikomo vifuatavyo hutumika:
| Urefu wa chini wa maudhui | herufi 3 | | Urefu wa juu wa maudhui | herufi 500 |
Wakati wa Kuzima Uchimbaji
Uchimbaji huendeshwa kiotomatiki wakati wowote kumbukumbu inapowezeshwa; hakuna
kibadilishaji tofauti cha uchimbaji pekee. Ili kuuzima, zima kumbukumbu kabisa (enabled: false
kupitia PUT /api/settings/memory). Fikiria kufanya hivyo wakati:
- Una ujazo mkubwa wa ujumbe na gharama ya uchimbaji si ndogo
- Mazungumzo yako mengi ni ya muda mfupi (gumzo, utatuzi wa hitilafu) bila thamani ya muda mrefu
- Tayari unanasa muktadha kupitia programu-jalizi maalum
Urekebishaji wa Hybrid RRF (v3.8.16+)
Algoriti ya Reciprocal Rank Fusion (RRF) huunganisha matokeo ya FTS5 (neno muhimu) na vekta (kisemantiki). Kigezo cha k hudhibiti uzito unaotolewa kwa matokeo yaliyo katika nafasi za chini.
Fomula
Kwa kila kumbukumbu inayotarajiwa, alama ya RRF ni:
RRF(d) = Σ 1 / (k + rank_i(d))
Ambapo:
kni thamani isiyobadilika (chaguo-msingi 60)rank_i(d)ni nafasi ya hatidkatika mfumo wa i wa urejeshaji (FTS, vekta)- Jumla inajumuisha mifumo yote ya urejeshaji
Jinsi k Inavyoathiri Matokeo
Thamani ya k |
Athari | Inafaa zaidi kwa |
|---|---|---|
k=0 |
Muunganisho halisi wa nafasi (bila ulainishaji) | Msingi wa kinadharia |
k=10-30 |
Huyapa matokeo ya juu uzito mkubwa, nafasi za chini huchangia kwa kiasi kidogo | Wakati matokeo 3 ya juu kwa kawaida ni sahihi |
k=60 (chaguo-msingi) |
Uwiano — matokeo 10 ya juu yote huchangia kwa kiasi kikubwa | Urejeshaji wa matumizi ya jumla |
k=100+ |
Tambarare zaidi — hata matokeo ya nafasi za chini yanaweza kutawala yakionekana katika mifumo mingi | Wakati urejeshaji > usahihi ni muhimu |
Kurekebisha k kwa Vitendo
# Chaguo-msingi
MEMORY_RRF_K=60
# Usahihi mkali (kumbukumbu ndogo, hati chache)
MEMORY_RRF_K=20
# Urejeshaji wa kiwango cha juu (kumbukumbu kubwa, hoja mbalimbali)
MEMORY_RRF_K=120
Mfano wenye k=20:
- Nafasi ya FTS 1 → mchango
1/21 = 0.048 - Nafasi ya FTS 10 → mchango
1/30 = 0.033 - Nafasi ya vekta 1 → mchango
0.048 - Kiwango cha juu kilichounganishwa:
0.096
Mfano wenye k=60:
- Nafasi ya FTS 1 → mchango
1/61 = 0.016 - Nafasi ya FTS 10 → mchango
1/70 = 0.014 - Nafasi ya vekta 1 → mchango
0.016 - Kiwango cha juu kilichounganishwa:
0.033
Kwa k ya juu zaidi, tofauti ya uwiano kati ya nafasi ya 1 na nafasi ya 10 huwa ndogo zaidi, kwa hivyo algoriti hutegemea zaidi makubaliano kati ya mifumo ya urejeshaji kuliko uhakika wa nafasi ya juu.
Wakati wa Kubadilisha k
| Dalili | Jaribu |
|---|---|
| Tokeo la juu daima hushinda, lakini si sahihi | Punguza k (k.m., 20) — uhakika wa nafasi ya juu una umuhimu zaidi |
| Jibu sahihi liko katika 5 bora lakini si la kwanza | Ongeza k (k.m., 100) — utoaji alama ulio tambarare zaidi huzawadia makubaliano |
| Urejeshaji ni wa juu lakini usahihi ni wa chini | Punguza k — boresha mpangilio wa nafasi |
| Urejeshaji ni wa chini (hati zinazohusiana hazipo) | Ongeza k — zipe hati za nafasi za chini nafasi |
Uwekaji Uzito wa RRF
Muunganisho wa nafasi zinazokinzana hutumia uzito sawa kwa nafasi ya vekta ya kisemantiki na nafasi ya utafutaji wa maandishi kamili:
RRF(d) = 1/(k + rank_vector) + 1/(k + rank_fts)
Hakuna viambajengo vya mazingira vya kurekebisha uzito mmoja mmoja (MEMORY_RRF_VECTOR_WEIGHT/MEMORY_RRF_FTS_WEIGHT havipo).
Mkakati wa Ufupishaji (v3.8.16+)
Moduli ya summarization.ts (src/lib/memory/summarization.ts) hubana kumbukumbu za zamani ili kuweka seti inayotumika ikiwa ndogo huku ikihifadhi uwezo wa kukumbuka.
Wakati Ufupishaji Unapoanzishwa
| Kichochezi | Kizingiti (chaguo-msingi) |
|---|---|
| Kichochezi cha mkono kupitia API | haitumiki |
Kinachofupishwa
Sehemu mbili za kuingilia zinasafirishwa kutoka summarization.ts:
summarizeMemories(apiKeyId, sessionId?, maxTokens = 4000)— hubana kumbukumbu za kipindi kuwa matini moja ya muhtasari iliyowekewa kikomo na bajeti ya tokeni.summarizeMemoriesOlderThan(apiKeyId, days, dryRun)— ubanaji unaotegemea umri unaotumiwa na API: huchagua kila kumbukumbu iliyo na umri unaozididays, huunda kumbukumbu moja ya muhtasari uliobanwa kutoka kwazo, na (dryRunikiwafalse) hufuta kumbukumbu asili. PitishadryRun: trueili kuhakiki seti ya kumbukumbu zinazolengwa na jumla ya tokeni bila kubadilisha chochote.
Hakuna hatua ya kuzipanga kwa makundi ya lebo/ufunguo wala ukadiriaji wa kila kumbukumbu wa "msingi dhidi ya inayoweza kufupishwa" — uteuzi unategemea kikomo cha umri pekee, na matini ya muhtasari ni mstari uliobanwa wenye kiambishi awali cha aina kwa kila kumbukumbu inayolengwa.
Kuanzisha Ufupishaji
Ufupishaji ni wa mkono / hiari — mpangilio wa autoSummarize ni false kwa
chaguo-msingi, kwa hivyo hakuna chochote kinachobanwa kiotomatiki. Uanzishe kupitia API:
curl -X POST http://localhost:20128/api/memory/summarize \
-H "Authorization: Bearer $OMNIROUTE_KEY"
Ili kuendelea kuuzima, acha tu autoSummarize katika thamani yake ya chaguo-msingi (false).
Vidokezo vya Ubora wa Ufupishaji
- Hakiki kwanza kwa kutumia
dryRun—summarizeMemoriesOlderThan(..., true)hurejesha orodha ya kumbukumbu zinazolengwa na jumla ya tokeni ili uweze kuthibitisha kitakachounganishwa kabla ya kufuta kumbukumbu asili. - Tekeleza ufupishaji wakati wa saa zenye msongamano mdogo ikiwa una mkusanyiko mkubwa wa kumbukumbu — mwito wa LLM ndio sehemu ya polepole
# Kwa mtindo wa Cron: fupisha kila siku saa 3 asubuhi
0 3 * * * curl -X POST http://localhost:20128/api/memory/summarize \
-H "Authorization: Bearer $OMNIROUTE_KEY"
Muundo wa Mtoa Huduma wa MemoryBackend
Chanzo rasmi:
src/lib/memory/backend.ts,src/lib/memory/genericBackend.ts,src/lib/memory/manager.tsMajaribio:src/lib/memory/__tests__/generic-backend.test.ts
Muundo wa mtoa huduma wa MemoryBackend unaanzisha safu ya uondoaji ya sehemu ya nyuma inayoweza kuchomekwa juu ya injini iliyopo ya kumbukumbu. Badala ya kutegemea utekelezaji mmoja wa hifadhi, mfumo wa kumbukumbu sasa unatumia sehemu nyingi za nyuma (SQLite, Obsidian, Notion, sehemu maalum za nyuma za HTTP) zenye uelekezaji unaoweza kusanidiwa wa msingi/mbadala.
Usanifu
┌──────────────────────────────────────────────────────────┐
│ Njia za API │
│ (src/app/api/memory/route.ts) │
└──────────────────────┬───────────────────────────────────┘
│
┌──────────────────────▼───────────────────────────────────┐
│ MemoryManager │
│ Mratibu wa singleton (manager.ts) │
│ │
│ Msingi ───► Sehemu ya Nyuma A (mf. SQLite) │
│ Mbadala ──► Sehemu ya Nyuma B (mf. Obsidian) │
│ Sehemu ya Nyuma C (mf. Notion kupitia │
│ GenericBackend) │
└──────────────────────┬───────────────────────────────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌──────────────────┐
│ Sehemu ya │ │ Sehemu ya │ │ GenericMemory │
│ Nyuma ya │ │ Nyuma ya │ │ Backend (HTTP) │
│ SQLite │ │ Obsidian │ │ │
└────────────┘ └────────────┘ └──────────────────┘
Kiolesura cha Msingi (backend.ts)
Kila sehemu ya nyuma lazima itekeleze kiolesura cha MemoryBackend:
interface MemoryBackend {
readonly id: string;
readonly displayName: string;
// CRUD
create(input: CreateMemoryInput): Promise<Memory>;
get(id: string): Promise<Memory | null>;
update(id: string, updates: Partial<...>): Promise<boolean>;
delete(id: string): Promise<boolean>;
list(filter: MemoryFilter): Promise<{ data: Memory[]; total: number; byType: Record<string, number> }>;
// Utafutaji
search(config: SearchConfig): Promise<Memory[]>;
// Hali ya mfumo
health(): Promise<HealthCheckResult>;
// Mzunguko wa maisha (si lazima)
initialize?(): Promise<void>;
shutdown?(): Promise<void>;
}
MemoryManager (manager.ts)
Mratibu wa singleton ambaye:
- Husajili sehemu za nyuma kupitia
register(backend)— huitwa wakati wa kuanzisha kutokaindex.ts - Husanidi sehemu ya msingi na mbadala kupitia
configure(primary, fallbacks) - Huelekeza CRUD/utafutaji kwenda sehemu ya msingi, akitumia mlolongo wa sehemu mbadala inaposhindikana
- Hukagua hali ya sehemu zote za nyuma mara kwa mara
Tabia ya sehemu mbadala:
| Operesheni | Sehemu ya msingi | Sehemu mbadala |
|---|---|---|
create |
✅ Ya msingi pekee | ❌ |
get |
✅ Jaribu ya msingi kwanza | ✅ Tumia mbadala ikiwa ni null |
update |
✅ Ya msingi pekee | ✅ Usawazishaji usiosubiri jibu |
delete |
✅ Ya msingi pekee | ✅ Usawazishaji usiosubiri jibu |
list |
✅ Ya msingi pekee | ❌ |
search |
✅ Ya msingi kwanza | ✅ Mbadala kunapotokea hitilafu |
GenericMemoryBackend (genericBackend.ts)
Kiunganishi cha jumla cha HTTP ambacho hurekebisha API yoyote ya REST kuwa MemoryBackend. Kinafaa kwa:
- Notion — unganisha kupitia Notion API
- Obsidian — unganisha kupitia Obsidian Local REST API
- Sehemu maalum za nyuma — huduma yoyote inayotoa API ya kumbukumbu ya RESTful
Usanidi:
interface GenericBackendConfig {
baseUrl: string; // URL ya msingi ya API ya backend
apiKey?: string; // Tokeni ya Bearer kwa ajili ya uthibitishaji
headers?: Record<string, string>; // Vichwa maalum vya HTTP
timeout?: number; // Muda wa mwisho wa ombi (chaguomsingi: 30000ms)
backendType?: string; // Kwa ajili ya kumbukumbu za matukio
// Ubatilishaji wa endpoint (chaguomsingi hutumia kanuni za REST)
endpoints?: {
search?: string; // chaguomsingi: "/memories/search"
create?: string; // chaguomsingi: "/memories"
list?: string; // chaguomsingi: "/memories"
get?: string; // chaguomsingi: "/memories/{id}"
update?: string; // chaguomsingi: "/memories/{id}"
delete?: string; // chaguomsingi: "/memories/{id}"
health?: string; // chaguomsingi: "/health"
};
// Ulinganishaji wa majina ya vigezo vya hoja
queryParams?: {
query?/apiKeyId?/limit?/offset?/strategy?/maxTokens?/type?/sessionId?/orderBy?/orderDir?/options?
};
// Ulinganishaji wa majina ya vigezo vya njia
pathParams?: {
id?/memoryId?
};
}
Backend zinazojulikana zimesanidiwa mapema katika KNOWN_BACKENDS:
createKnownBackend("obsidian"); // → GenericMemoryBackend iliyoelekezwa kwenye localhost:27123
createKnownBackend("notion"); // → GenericMemoryBackend iliyoelekezwa kwenye api.notion.com/v1
Backend Zilizojumuishwa
SQLiteBackend (sqliteBackend.ts)
Backend msingi ya chaguomsingi. Hufunika hifadhi iliyopo ya kumbukumbu inayotumia SQLite kupitia src/lib/memory/store.ts. Husajiliwa kiotomatiki wakati wa kuwasha.
import { sqliteBackend } from "./sqliteBackend";
memoryManager.register(sqliteBackend);
ObsidianBackend (obsidianBackend.ts)
Hufunika muunganisho uliopo wa Obsidian (src/lib/memory/obsidianBackend.ts). Huunganisha kwenye vault ya Obsidian kupitia Obsidian Local REST API.
Mipangilio
Mipangilio ya backend ya kumbukumbu huhifadhiwa katika jedwali la mipangilio ya programu na kudhibitiwa kupitia src/lib/memory/settings.ts:
| Mpangilio | Ufunguo wa Env/Usanidi | Chaguomsingi | Maelezo |
|---|---|---|---|
| Backend msingi | memoryPrimaryBackend |
"sqlite" |
ID ya backend msingi |
| Backend za akiba | memoryFallbackBackends |
[] |
ID za backend za akiba zilizopangwa |
| Misanidi ya backend | memoryBackendConfigs |
{} |
Ubatilishaji wa usanidi kwa kila backend |
Mipangilio husawazishwa kupitia normalizeMemorySettings() na kuhifadhiwa kwenye akiba katika getMemorySettings().
Mtiririko wa Uanzishaji
Uanzishaji wa programu
→ uingizaji wa index.ts (athari ya pembeni): husajili SQLiteBackend
→ initMemoryBackends() huitwa kutoka kwenye mzunguko wa maisha wa programu:
1. Pakia mipangilio (getMemorySettings)
2. Sanidi backend msingi + za akiba
3. Anzisha backend zote (ukaguzi wa afya)
4. Tayari kwa maombi
Kuongeza Backend Mpya
- Tekeleza kiolesura cha
MemoryBackendkatikasrc/lib/memory/<name>Backend.ts - Hamisha kutoka
src/lib/memory/index.ts - Sajili kwa
memoryManager.register(yourBackend)wakati wa kuwasha - Sanidi kupitia mipangilio: weka
memoryPrimaryBackendkuwa ID ya backend yako - Jaribu ukitumia
src/lib/memory/__tests__/generic-backend.test.tskama rejeleo
Mfano: Backend ya Brain
import { createGenericMemoryBackend } from "./genericBackend";
const brainBackend = createGenericMemoryBackend("brain", "BK-Brain", {
baseUrl: process.env.BRAIN_API_URL || "http://localhost:9099",
apiKey: process.env.BRAIN_API_KEY,
endpoints: {
search: "/api/memory/search",
create: "/api/memory",
health: "/api/health",
},
});
memoryManager.register(brainBackend);
Uthibitishaji
Majaribio ya kitengo
npx vitest run src/lib/memory/__tests__/generic-backend.test.ts --reporter=verbose
Matokeo yanayotarajiwa: majaribio 35, yote yakifaulu yakijumuisha:
- Kijenzi (2)
- Ukaguzi wa afya (4) — mafanikio, hitilafu 500, hitilafu ya mtandao, ucheleweshaji
- Uanzishaji (2) — mafanikio, kushindwa
- Uundaji (2) — endpoint ya chaguomsingi, endpoint maalum
- Upataji (4) — mafanikio, 404 → null, isiyo 404 husababisha hitilafu, vigezo maalum vya njia
- Usasishaji (2) — mafanikio, 404 → false
- Ufutaji (2) — mafanikio, 404 → false
- Uorodheshaji (2) — vigezo vya hoja, majina maalum ya vigezo
- Utafutaji (3) — vigezo vya hoja, endpoint maalum, ubadilishaji wa options kuwa mfuatano
- Vichwa vya uthibitishaji (2) — tokeni ya Bearer, vichwa maalum
- Kiwanda (1)
Ukaguzi wa aina
npm run typecheck:core
Inayotarajiwa: hitilafu 0.