@snoai/memory 1.2.13 → 1.5.0
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/README.md +1 -1
- package/dist/{access-tracker-CglGg8uS.d.ts → access-tracker-B1H2AJlH.d.ts} +4 -4
- package/dist/{adapter-Cxyzdq6H.d.ts → adapter-CgdVA88V.d.ts} +2 -2
- package/dist/{agent-llm-port-DY2290EK.d.ts → agent-llm-port-BlFrD2ro.d.ts} +5 -0
- package/dist/{atomic-memory-extraction-DO4yTfch.d.ts → atomic-memory-extraction-DCMTQ0h-.d.ts} +4 -4
- package/dist/{atomic-memory-extraction-DWhlXJT6.js → atomic-memory-extraction-De86y7O-.js} +4 -4
- package/dist/{b-profile-section-dictionary-provider-BkUdS1SY.d.ts → b-profile-section-dictionary-provider-DbqdRYMw.d.ts} +1 -1
- package/dist/{capture-policy-detector-C7MA4jSr.d.ts → capture-policy-detector-D4ziS7KF.d.ts} +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/{config-D_KOwEyg.js → config-DWeuetYo.js} +740 -447
- package/dist/{derived-suppression-cache-CmS4xAaN.d.ts → derived-suppression-cache-2xOq6XHX.d.ts} +1 -1
- package/dist/diagnostic-encoder.js +1 -1
- package/dist/{embedding-provider-client-vynZMuit.d.ts → embedding-provider-client-CELWtPgt.d.ts} +6 -0
- package/dist/{embedding-provider-client-40tpzKou.js → embedding-provider-client-CgpUK_1G.js} +16 -1
- package/dist/{index-Pb9LrHgL.d.ts → index-BGu91bjB.d.ts} +25 -19
- package/dist/{index-CTi1R9T4.d.ts → index-PjHhlG6e.d.ts} +2 -2
- package/dist/index.d.ts +11 -11
- package/dist/index.js +5 -5
- package/dist/internal/config/index.d.ts +2 -2
- package/dist/internal/config/index.js +25 -19
- package/dist/internal/config/plugin-config-schema.d.ts +1 -1
- package/dist/internal/config/plugin-config-schema.js +1 -1
- package/dist/internal/config/product-mode.d.ts +1 -1
- package/dist/internal/config/settings.d.ts +1 -1
- package/dist/internal/config/settings.js +3 -30
- package/dist/internal/config/skin-defaults.d.ts +1 -1
- package/dist/internal/contract/profile.d.ts +1 -1
- package/dist/internal/contract/routes.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-cli-shared.d.ts +5 -5
- package/dist/internal/engine/bindings/memory-forget-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-list-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-recall-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-stats-tool.js +1 -1
- package/dist/internal/engine/bindings/memory-store-tool.js +3 -3
- package/dist/internal/engine/bindings/memory-tool-access.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-tool-access.js +1 -1
- package/dist/internal/engine/bindings/memory-tool-results.d.ts +1 -1
- package/dist/internal/engine/bindings/memory-tool-results.js +1 -1
- package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +6 -6
- package/dist/internal/engine/bindings/memory-tool-schemas.js +1 -1
- package/dist/internal/engine/bindings/memory-update-tool.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +5 -5
- package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +4 -4
- package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +1 -1
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +7 -7
- package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +2 -2
- package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +4 -4
- package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +1 -1
- package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +1 -1
- package/dist/internal/engine/extraction/atomic-memory-extraction.js +1 -1
- package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +1 -1
- package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +5 -5
- package/dist/internal/engine/extraction/capture-policy-detector.d.ts +1 -1
- package/dist/internal/engine/extraction/embedding-provider-client.d.ts +1 -1
- package/dist/internal/engine/extraction/embedding-provider-client.js +1 -1
- package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +2 -2
- package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +1 -1
- package/dist/internal/engine/extraction/memory-temporality-classifier.js +1 -1
- package/dist/internal/engine/observability/adapter.d.ts +1 -1
- package/dist/internal/engine/observability/memory-snapshot.d.ts +1 -1
- package/dist/internal/engine/observability/observable-embedder.d.ts +1 -1
- package/dist/internal/engine/observability/observable-embedder.js +1 -1
- package/dist/internal/engine/observability/observable-llm-client.d.ts +1 -1
- package/dist/internal/engine/observability/observable-memory-store.d.ts +1 -1
- package/dist/internal/engine/observability/observable-memory-store.js +1 -1
- package/dist/internal/engine/observability/observable-retriever.d.ts +1 -1
- package/dist/internal/engine/observability/observable-retriever.js +1 -1
- package/dist/internal/engine/observability/runtime-diagnostics.d.ts +1 -1
- package/dist/internal/engine/observability/runtime-diagnostics.js +1 -1
- package/dist/internal/engine/operations/memory-tier-promoter.d.ts +1 -1
- package/dist/internal/engine/operations/runtime-audit-log.d.ts +2 -2
- package/dist/internal/engine/provider/provider-registration.d.ts +4 -4
- package/dist/internal/engine/provider/provider-row-renderer.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-command-hooks.js +1 -1
- package/dist/internal/engine/reflection/reflection-deps.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-embedded-generator.js +1 -1
- package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-injection-hooks.js +1 -1
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +1 -1
- package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +1 -1
- package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +3 -3
- package/dist/internal/engine/reflection/strategy-hook-runner.js +2 -2
- package/dist/internal/engine/retrieval/access-tracker.d.ts +1 -1
- package/dist/internal/engine/retrieval/retriever.d.ts +2 -2
- package/dist/internal/engine/retrieval/retriever.js +1 -1
- package/dist/internal/engine/shared/memory-kind-policy.d.ts +1 -1
- package/dist/internal/engine/shared/paths.d.ts +2 -2
- package/dist/internal/engine/shared/types.d.ts +2 -2
- package/dist/internal/engine/shared/types.js +1 -1
- package/dist/internal/engine/telemetry/observe-ledger.d.ts +1 -1
- package/dist/internal/model/agent-llm-port.d.ts +1 -1
- package/dist/internal/model/llm-client.d.ts +2 -2
- package/dist/internal/model/llm-client.js +1 -1
- package/dist/internal/model/llm-mode-routing.d.ts +1 -1
- package/dist/internal/store/maintenance.d.ts +2 -2
- package/dist/internal/store/maintenance.js +4 -4
- package/dist/internal/store/store.d.ts +2 -2
- package/dist/internal/store/store.js +1 -1
- package/dist/{llm-client-B7LSFL_m.d.ts → llm-client-C-K7oyfu.d.ts} +1 -1
- package/dist/{llm-client-C7yyFWu-.js → llm-client-DDdUjYWS.js} +10 -3
- package/dist/{log-site-catalog.generated-BODn_6Kx.js → log-site-catalog.generated-Cn8rTa65.js} +94 -73
- package/dist/log-site-catalog.json +1 -1
- package/dist/{memory-kind-policy-B4IBMAlv.d.ts → memory-kind-policy-DgPCjfY4.d.ts} +1 -1
- package/dist/{memory-metadata-codec-BQ8tBY-g.d.ts → memory-metadata-codec-CfP9JLVO.d.ts} +1 -1
- package/dist/{memory-runtime-4iOpeP09.js → memory-runtime-jQke2sBc.js} +118 -78
- package/dist/{memory-snapshot-B8mQbWR-.d.ts → memory-snapshot-B6a-6nJ7.d.ts} +2 -2
- package/dist/{memory-store-base-CTAMKigD.d.ts → memory-store-base-upd9MuG6.d.ts} +4 -4
- package/dist/{memory-temporality-classifier-epuZlfXa.js → memory-temporality-classifier-BwBKEQbL.js} +1 -1
- package/dist/{memory-temporality-classifier-LByFBiFJ.d.ts → memory-temporality-classifier-DPk3_9Or.d.ts} +1 -1
- package/dist/{memory-tier-promoter-CSGa4LBH.d.ts → memory-tier-promoter-Cq23yveQ.d.ts} +1 -1
- package/dist/memory-tool-dependencies-C9qgVGOn.d.ts +14 -0
- package/dist/{memory-tool-dependencies-xLaWzwpI.js → memory-tool-dependencies-aAr7Pkuj.js} +1 -1
- package/dist/{observable-embedder-Da0teBqx.d.ts → observable-embedder-DihQuuQD.d.ts} +2 -2
- package/dist/{observable-llm-client-i0sp0veF.d.ts → observable-llm-client-BglDBFN5.d.ts} +3 -3
- package/dist/{observable-memory-store-CS87pitJ.d.ts → observable-memory-store--n02Dre8.d.ts} +5 -5
- package/dist/{observable-retriever-Bhfg9DsZ.d.ts → observable-retriever-CV6odifA.d.ts} +6 -6
- package/dist/paths-qJqwGcKl.d.ts +1 -0
- package/dist/{plugin-config-schema-CvAGFPyE.js → plugin-config-schema-D9riSXDg.js} +3 -20
- package/dist/{plugin-config-schema-CcEeAEdi.d.ts → plugin-config-schema-dV2_HgBo.d.ts} +2 -8
- package/dist/{profile-BMvnRqf5.d.ts → profile-CoLKGobS.d.ts} +1 -1
- package/dist/{profile-section-writer-DeD9GPQJ.js → profile-section-writer-Dd4FKpt5.js} +2 -2
- package/dist/{reflection-command-hooks-S5L6ZWeh.js → reflection-command-hooks-B2P4zDr6.js} +3 -3
- package/dist/{reflection-command-hooks-CFXyoVvE.d.ts → reflection-command-hooks-Cfv836Wc.d.ts} +4 -4
- package/dist/{reflection-deps-BPMrDU0a.d.ts → reflection-deps-DihlwQxE.d.ts} +4 -4
- package/dist/{reflection-embedded-generator-CF-NbuPS.d.ts → reflection-embedded-generator-DCZaS6kz.d.ts} +4 -4
- package/dist/{reflection-embedded-generator-nmVrj4AZ.js → reflection-embedded-generator-DV-NkeU-.js} +1 -1
- package/dist/{reflection-injection-hooks-BRIr3lJM.d.ts → reflection-injection-hooks-BYxkrds6.d.ts} +4 -4
- package/dist/{reflection-lifecycle-hooks-Ci8y4qHk.d.ts → reflection-lifecycle-hooks-Bwq2y5pe.d.ts} +3 -3
- package/dist/{rem-batch-executor-CfWChDAk.js → rem-batch-executor-B_49KivZ.js} +1 -1
- package/dist/{rem-trigger-B1P5_RqV.js → rem-trigger-DL0MlLeo.js} +180 -160
- package/dist/{retriever-CpyZs2ND.js → retriever-CsBW6MZv.js} +158 -162
- package/dist/{retriever-DdikFSDC.d.ts → retriever-hTIkt3CJ.d.ts} +19 -26
- package/dist/{runtime-audit-log-BVOxzkh7.d.ts → runtime-audit-log-eBrt_iPp.d.ts} +1 -1
- package/dist/{server-DOL3D6bb.js → server-BnBzsvMF.js} +9 -9
- package/dist/sidecar/main.js +2 -2
- package/dist/sno-station-mem-runtime-dependencies-9L8WkMMV.d.ts +31 -0
- package/dist/{sno-station-mem-runtime-dependencies-DZe3z4RY.js → sno-station-mem-runtime-dependencies-DrVDRAmf.js} +6 -6
- package/dist/{store-DY_rWx__.js → store-COwW7mIh.js} +1 -1
- package/dist/{store-DraRJ-HI.d.ts → store-DEG06TLb.d.ts} +2 -2
- package/dist/{strategy-hook-runner-CltVTtzk.js → strategy-hook-runner-CALbWcys.js} +1 -1
- package/dist/{strategy-hook-runner-DH7OEQrH.d.ts → strategy-hook-runner-D1sRVThs.d.ts} +7 -7
- package/dist/{types-DZGL4QXi.d.ts → types-DBEwNYdR.d.ts} +1 -1
- package/package.json +2 -2
- package/settings.default.json +0 -4
- package/dist/memory-tool-dependencies-Bl11T6Xm.d.ts +0 -14
- package/dist/paths-B5y-npWs.d.ts +0 -1
- package/dist/sno-station-mem-runtime-dependencies-DgAm7WqA.d.ts +0 -31
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { $ as FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION, A as modelCallDestination, At as FIXED_MEMORY_PROFILE_RECOVERY_ENTRIES, B as FIXED_EXTERNAL_VALUE_49, C as getSnoStationMemStateDir, Cn as CHUNK_OVERLAP_TOKENS, Cr as
|
|
1
|
+
import { $ as FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION, $n as MAX_CHUNK_FETCH_LIMIT, A as modelCallDestination, At as FIXED_MEMORY_PROFILE_RECOVERY_ENTRIES, B as FIXED_EXTERNAL_VALUE_49, C as getSnoStationMemStateDir, Cn as CHUNK_OVERLAP_TOKENS, Cr as LOCAL_EMBEDDING_CACHE_DIR_DEFAULT, Ct as FIXED_MEMORY_CHUNKS_MEM_FACET_IDX, D as settingsToPluginConfig, Dn as DEFAULT_IMPORTANCE, Dr as LocalReranker, Dt as FIXED_MEMORY_MEMORIES_FACT_ID_INSERT_GUARD, En as DEFAULT_BM25_WEIGHT, Er as LocalEmbedProvider, Et as FIXED_MEMORY_MEMORIES, Fn as EMBEDDER_DIM, G as FIXED_EXTERNAL_VALUE_55, H as FIXED_EXTERNAL_VALUE_52, Hn as HEAD_EXTRACT_OVERLAP_DROP_RATIO, In as EMBEDDER_MODEL_DEFAULT, Ir as REM_SIDECAR_TOKEN_HEADER, It as FIXED_MEMORY_SNO_EXTRACT_CHAT, J as FIXED_EXTERNAL_VALUE_58, Jn as LIGHTWEIGHT_FUSION_WEIGHT, K as FIXED_EXTERNAL_VALUE_56, Kn as INTRA_MEMORY_COSINE_THRESHOLD, Kt as FIXED_PROTOCOL_VALUE_69, Ln as EMBEDDER_PROVIDER_DEFAULT, Mn as DEFAULT_RERANK_TIMEOUT_MS, Mt as FIXED_MEMORY_PROVIDER_PROJECT_AGENTS, Nt as FIXED_MEMORY_PROVIDER_PROJECT_MAPPINGS, O as MODEL_CALLS, On as DEFAULT_RECALL_LIFECYCLE, Or as ensureModelDownloaded, Ot as FIXED_MEMORY_MEMORIES_FACT_ID_UPDATE_GUARD, P as observeAgentId, Pn as DEFAULT_VECTOR_WEIGHT, Q as FIXED_IDX_MEMORY, Rn as EVAL_QA_TRACES_FILENAME, Rt as FIXED_MEMORY_TASK_LIFECYCLE_COMMANDS, Sn as CHUNK_MIN_TOKENS, Sr as CachedEmbeddingProvider, St as FIXED_MEMORY_CHUNKS_MEMORY_ID_IDX, T as readSettings, Tn as CHUNK_TOKENIZER_MODE, Tt as FIXED_MEMORY_EXTRACTION_TIMESTAMPS, U as FIXED_EXTERNAL_VALUE_53, Un as HEAD_EXTRACT_TOKEN_BUDGET, V as FIXED_EXTERNAL_VALUE_51, Vn as HEAD_EXTRACT_MIN_CONTENT_TOKENS, W as FIXED_EXTERNAL_VALUE_54, Wn as IMPORTANCE_WEIGHT_BASE, X as FIXED_EXTERNAL_VALUE_8, Y as FIXED_EXTERNAL_VALUE_62, Yn as LIGHTWEIGHT_RERANK_PENALTY, Z as FIXED_EXTERNAL_VALUE_9, _t as FIXED_MEMORY_CHUNKS, a as REM_MODEL_OUTPUT_TOKEN_CAP, an as PERSISTED_PROVIDER_SYSTEM, ar as MULTI_HIT_BONUS_CAP, at as FIXED_IDX_MEMORY_MEMORIES_LANE_PROJECT, bn as CHUNKING_VERSION$1, br as experimentMmrDisabled, bt as FIXED_MEMORY_CHUNKS_AU, cn as SUPPORTED_LOCALES, cr as RECENCY_WEIGHT, ct as FIXED_IDX_MEMORY_MEMORIES_PROJECT_FACT_KEY_ACTIVE, d as getRemDiscoveryPath, dn as ADJACENCY_BONUS_PER_PAIR, dr as RERANK_BLEND_CROSS, dt as FIXED_MEMORY_ACTIVE_TASK_EVIDENCE, en as FIXED_VEC_MEMORY, er as MAX_LIST_LIMIT, et as FIXED_IDX_MEMORY_ACTIVE_TASK_EVIDENCE_INSTANCE, fr as RERANK_BLEND_VECTOR, ft as FIXED_MEMORY_ACTIVE_TASK_INSTANCES, g as readRemOperationalConfig, gt as FIXED_MEMORY_ACTIVE_TASK_TRANSITIONS, hr as TIME_DECAY_FLOOR, ht as FIXED_MEMORY_ACTIVE_TASK_REVISIONS, in as PERSISTED_CONTENT_HASH_V3, ir as MMR_LAMBDA, it as FIXED_IDX_MEMORY_MEMORIES_FACT_ID, jt as FIXED_MEMORY_PROVIDER_AGENT_MAPPINGS, k as MODEL_CALL_WORKLOAD, kt as FIXED_MEMORY_MIGRATION_MARKERS, lt as FIXED_IDX_MEMORY_MEMORIES_PROJECT_TIMESTAMP, mt as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_MANIFESTS, nn as PERSISTED_CANDIDATE_HASH_V1, nt as FIXED_IDX_MEMORY_MEMORIES_CATEGORY, o as REM_RUN_PATH, or as MULTI_HIT_BONUS_PER_HIT, ot as FIXED_IDX_MEMORY_MEMORIES_PROJECT, pr as RETRIEVAL_STORAGE_CHUNK_PROFILE, pt as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_EVIDENCE, q as FIXED_EXTERNAL_VALUE_57, qn as LIGHTWEIGHT_COSINE_WEIGHT, qt as FIXED_PROTOCOL_VALUE_73, r as REM_CORRELATION_ID_HEADER, rn as PERSISTED_CONTENT_HASH_V1, rt as FIXED_IDX_MEMORY_MEMORIES_CONTENT_HASH, s as REM_SIDECAR_HOST, sn as llmRoutingConfigSchema, st as FIXED_IDX_MEMORY_MEMORIES_PROJECT_CONTENT_HASH, tn as FIXED_VEC_MEMORY_CHUNKS, tt as FIXED_IDX_MEMORY_ACTIVE_TASK_INSTANCES_PROJECTION, un as ADJACENCY_BONUS_CAP, ut as FIXED_MEMORY, vn as BONUS_TOTAL_INVARIANT, vt as FIXED_MEMORY_CHUNKS_AD, wn as CHUNK_TARGET_TOKENS, wr as LOCAL_EMBEDDING_MODEL, wt as FIXED_MEMORY_CHUNKS_MEM_IDX, xn as CHUNK_MAX_TOKENS, xt as FIXED_MEMORY_CHUNKS_FTS, yn as CACHE_TTL_MS, yr as experimentCandidatePoolOverride, yt as FIXED_MEMORY_CHUNKS_AI, zt as FIXED_MEMORY_UNPLACED_CANDIDATES } from "./config-DWeuetYo.js";
|
|
2
2
|
import { createLogger, createLogger as createLogger$1, currentLogContext, privateLogReference, withLogContext } from "@snoai/utils/logger";
|
|
3
3
|
import path, { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { appendFileSync, closeSync, createReadStream, existsSync, fstatSync, fsyncSync, ftruncateSync, mkdirSync, openSync, readFileSync, readSync, realpathSync, renameSync, rmSync, statSync, writeFileSync, writeSync } from "node:fs";
|
|
5
5
|
import { arch, availableParallelism, platform } from "node:os";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { createHash, createHmac, createPublicKey, randomUUID, randomUUID as randomUUID$1, timingSafeEqual, verify } from "node:crypto";
|
|
7
8
|
import { LRUCache } from "lru-cache";
|
|
8
9
|
import { z } from "zod";
|
|
9
10
|
import { CHUNKING_VERSION, aggregateChunksToMemories, buildChunkId, buildDensePayload, chunk, chunk as chunk$1, countTokens, expandSnippetWindow, extractMetadataHeader, headExtract, shouldDropSummary } from "@snoai/chunking";
|
|
10
11
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
11
|
-
import { createHash, createHmac, createPublicKey, randomUUID, randomUUID as randomUUID$1, timingSafeEqual, verify } from "node:crypto";
|
|
12
12
|
import { getDek, openEncryptedDb, openEncryptedDbReadonly } from "@snoai/sqlite-crypto";
|
|
13
13
|
import { appendFile, mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
14
14
|
import { Temporal } from "@js-temporal/polyfill";
|
|
@@ -7413,6 +7413,7 @@ function createLlmClient(config) {
|
|
|
7413
7413
|
const hostInFlight = ++hostRequestsInFlight;
|
|
7414
7414
|
const result = await withLogContext({ attempt_id: randomUUID() }, async () => {
|
|
7415
7415
|
let outcome = "failed";
|
|
7416
|
+
let hostReport = {};
|
|
7416
7417
|
try {
|
|
7417
7418
|
const completion = await agentPort.complete({
|
|
7418
7419
|
system: systemContent,
|
|
@@ -7423,6 +7424,7 @@ function createLlmClient(config) {
|
|
|
7423
7424
|
...request.signal ? { signal: request.signal } : {}
|
|
7424
7425
|
});
|
|
7425
7426
|
outcome = completion.kind;
|
|
7427
|
+
if (completion.kind === "ok") hostReport = completion;
|
|
7426
7428
|
return completion;
|
|
7427
7429
|
} finally {
|
|
7428
7430
|
hostRequestsInFlight -= 1;
|
|
@@ -7434,8 +7436,13 @@ function createLlmClient(config) {
|
|
|
7434
7436
|
duration_ms: performance.now() - hostStarted,
|
|
7435
7437
|
in_flight_at_dispatch: hostInFlight,
|
|
7436
7438
|
requested_model: "unavailable",
|
|
7437
|
-
returned_model: "unavailable",
|
|
7438
|
-
usage:
|
|
7439
|
+
returned_model: hostReport.model ?? "unavailable",
|
|
7440
|
+
usage: hostReport.usage ? {
|
|
7441
|
+
source: "provider_reported",
|
|
7442
|
+
inputTokens: hostReport.usage.inputTokens,
|
|
7443
|
+
outputTokens: hostReport.usage.outputTokens,
|
|
7444
|
+
totalTokens: hostReport.usage.inputTokens + hostReport.usage.outputTokens
|
|
7445
|
+
} : { source: "unavailable" },
|
|
7439
7446
|
prompt_template_hash: request.promptTemplateHash ?? "unavailable",
|
|
7440
7447
|
extraction_skill_hash: request.extractionSkillHash ?? "unavailable",
|
|
7441
7448
|
prompt_template_unavailable_reason: request.promptTemplateHash ? void 0 : "caller_does_not_provide_template_identity",
|
|
@@ -7454,7 +7461,7 @@ function createLlmClient(config) {
|
|
|
7454
7461
|
dispatch_to_headers_ms: "unavailable",
|
|
7455
7462
|
headers_to_body_ms: "unavailable",
|
|
7456
7463
|
first_token_ms: "unavailable",
|
|
7457
|
-
provider_unavailable_reason: "host_port_does_not_report_provider_fields"
|
|
7464
|
+
...hostReport.usage || hostReport.model ? {} : { provider_unavailable_reason: "host_port_does_not_report_provider_fields" }
|
|
7458
7465
|
}, {
|
|
7459
7466
|
event_name: "llm.request.completed",
|
|
7460
7467
|
file: "packages/memory/src/model/llm-client.ts",
|
|
@@ -26393,6 +26400,7 @@ var Embedder = class {
|
|
|
26393
26400
|
model;
|
|
26394
26401
|
warmupPromise = null;
|
|
26395
26402
|
modelDownload;
|
|
26403
|
+
reranker;
|
|
26396
26404
|
/**
|
|
26397
26405
|
* Initializes embedding generation collaborators while keeping runtime work in explicit
|
|
26398
26406
|
* methods.
|
|
@@ -26410,6 +26418,12 @@ var Embedder = class {
|
|
|
26410
26418
|
this.dimensions = inner.dimension;
|
|
26411
26419
|
this.providerKind = providerKind;
|
|
26412
26420
|
this.model = config.model && config.model.trim().length > 0 ? config.model : LOCAL_EMBEDDING_MODEL;
|
|
26421
|
+
this.reranker = new LocalReranker({
|
|
26422
|
+
cacheDir: resolveEmbeddingCacheDir(config),
|
|
26423
|
+
offline: config.offline === true,
|
|
26424
|
+
...config.mirror ? { mirror: config.mirror } : {},
|
|
26425
|
+
intraOpNumThreads: config.sessionOptions?.intraOpNumThreads ?? Math.max(1, Math.min(4, Math.floor(availableParallelism() / 2)))
|
|
26426
|
+
});
|
|
26413
26427
|
this.provider = new CachedEmbeddingProvider(inner, {
|
|
26414
26428
|
maxSize: 256,
|
|
26415
26429
|
ttlMs: CACHE_TTL_MS
|
|
@@ -26579,11 +26593,19 @@ var Embedder = class {
|
|
|
26579
26593
|
});
|
|
26580
26594
|
return this.warmupPromise;
|
|
26581
26595
|
}
|
|
26596
|
+
/**
|
|
26597
|
+
* Local relevance scores (raw logits, higher is more relevant) for each text against the query, or undefined while
|
|
26598
|
+
* the local reranker is not loaded; the first call starts loading it in the background.
|
|
26599
|
+
*/
|
|
26600
|
+
scoreRelevance(query, texts, signal) {
|
|
26601
|
+
return this.reranker.score(query, texts, signal);
|
|
26602
|
+
}
|
|
26582
26603
|
/** Implements dispose as the local embedding generation operation. */
|
|
26583
26604
|
async dispose() {
|
|
26584
26605
|
const warmup = this.warmupPromise;
|
|
26585
26606
|
if (warmup) await warmup.catch(() => void 0);
|
|
26586
26607
|
await this.provider.dispose();
|
|
26608
|
+
await this.reranker.dispose();
|
|
26587
26609
|
}
|
|
26588
26610
|
};
|
|
26589
26611
|
/** Creates the embedder facade around the local ONNX provider. */
|
|
@@ -27194,9 +27216,7 @@ const DEFAULT_RETRIEVAL_CONFIG = {
|
|
|
27194
27216
|
recencyWeight: RECENCY_WEIGHT,
|
|
27195
27217
|
temporalExpiry: false,
|
|
27196
27218
|
temporalDecay: true,
|
|
27197
|
-
rerankModel: DEFAULT_RERANK_MODEL,
|
|
27198
27219
|
rerankTimeoutMs: DEFAULT_RERANK_TIMEOUT_MS,
|
|
27199
|
-
rerankProvider: "voyage",
|
|
27200
27220
|
lengthNormAnchor: 0,
|
|
27201
27221
|
hardMinScore: 0,
|
|
27202
27222
|
timeDecayHalfLifeDays: 60,
|
|
@@ -27501,11 +27521,10 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27501
27521
|
this.throwIfAborted(context);
|
|
27502
27522
|
const rerankStageMetadata = rerankOutcome.fallback ? {
|
|
27503
27523
|
...rerankOutcome.stats,
|
|
27504
|
-
rerankFallbackReason: rerankOutcome.fallback.reason
|
|
27505
|
-
rerankFallbackProvider: rerankOutcome.fallback.provider
|
|
27524
|
+
rerankFallbackReason: rerankOutcome.fallback.reason
|
|
27506
27525
|
} : rerankOutcome.stats;
|
|
27507
27526
|
trace?.endStage(fused.map((r) => r.entry.id), fused.map((r) => r.score), rerankStageMetadata);
|
|
27508
|
-
fused = this.applyScoringPipeline(fused, trace, context.limit);
|
|
27527
|
+
fused = this.applyScoringPipeline(fused, trace, context.limit, rerankOutcome.modelOrder);
|
|
27509
27528
|
trace?.startStage("min_score_filter", fused.map((result) => result.entry.id));
|
|
27510
27529
|
fused = fused.filter((result) => result.score >= (context.minScore ?? this.config.minScore));
|
|
27511
27530
|
trace?.endStage(fused.map((result) => result.entry.id), fused.map((result) => result.score));
|
|
@@ -27574,100 +27593,31 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27574
27593
|
});
|
|
27575
27594
|
//#endregion
|
|
27576
27595
|
//#region src/engine/retrieval/retrieval-rerank-provider.ts
|
|
27577
|
-
|
|
27578
|
-
|
|
27579
|
-
|
|
27580
|
-
|
|
27581
|
-
|
|
27582
|
-
|
|
27583
|
-
|
|
27584
|
-
|
|
27585
|
-
|
|
27586
|
-
|
|
27587
|
-
|
|
27588
|
-
|
|
27589
|
-
}
|
|
27590
|
-
|
|
27591
|
-
switch (provider) {
|
|
27592
|
-
case "tei":
|
|
27593
|
-
case "sno-gpu": return {
|
|
27594
|
-
headers: {
|
|
27595
|
-
"Content-Type": "application/json",
|
|
27596
|
-
Authorization: `Bearer ${apiKey}`,
|
|
27597
|
-
...provider === "sno-gpu" ? {
|
|
27598
|
-
"X-Sno-Source": "sno-station",
|
|
27599
|
-
"X-Sno-Workload": "station-rerank"
|
|
27600
|
-
} : {}
|
|
27601
|
-
},
|
|
27602
|
-
body: {
|
|
27603
|
-
query,
|
|
27604
|
-
texts: candidates,
|
|
27605
|
-
raw_scores: true
|
|
27606
|
-
}
|
|
27607
|
-
};
|
|
27608
|
-
case "dashscope": return {
|
|
27609
|
-
headers: {
|
|
27610
|
-
"Content-Type": "application/json",
|
|
27611
|
-
Authorization: `Bearer ${apiKey}`
|
|
27612
|
-
},
|
|
27613
|
-
body: {
|
|
27614
|
-
model,
|
|
27615
|
-
input: {
|
|
27616
|
-
query,
|
|
27617
|
-
documents: candidates
|
|
27618
|
-
}
|
|
27619
|
-
}
|
|
27620
|
-
};
|
|
27621
|
-
case "pinecone": return {
|
|
27622
|
-
headers: {
|
|
27623
|
-
"Content-Type": "application/json",
|
|
27624
|
-
"Api-Key": apiKey,
|
|
27625
|
-
"X-Pinecone-API-Version": "2024-10"
|
|
27626
|
-
},
|
|
27627
|
-
body: {
|
|
27628
|
-
model,
|
|
27629
|
-
query,
|
|
27630
|
-
documents: candidates.map((text) => ({ text })),
|
|
27631
|
-
top_n: topN,
|
|
27632
|
-
rank_fields: ["text"]
|
|
27633
|
-
}
|
|
27634
|
-
};
|
|
27635
|
-
case "voyage": return {
|
|
27636
|
-
headers: {
|
|
27637
|
-
"Content-Type": "application/json",
|
|
27638
|
-
Authorization: `Bearer ${apiKey}`
|
|
27639
|
-
},
|
|
27640
|
-
body: {
|
|
27641
|
-
model,
|
|
27642
|
-
query,
|
|
27643
|
-
documents: candidates,
|
|
27644
|
-
top_k: topN
|
|
27645
|
-
}
|
|
27646
|
-
};
|
|
27647
|
-
default: return {
|
|
27648
|
-
headers: {
|
|
27649
|
-
"Content-Type": "application/json",
|
|
27650
|
-
Authorization: `Bearer ${apiKey}`
|
|
27651
|
-
},
|
|
27652
|
-
body: {
|
|
27653
|
-
model,
|
|
27654
|
-
query,
|
|
27655
|
-
documents: candidates,
|
|
27656
|
-
top_n: topN
|
|
27657
|
-
}
|
|
27658
|
-
};
|
|
27659
|
-
}
|
|
27596
|
+
function buildRerankRequest(apiKey, query, candidates) {
|
|
27597
|
+
return {
|
|
27598
|
+
headers: {
|
|
27599
|
+
"Content-Type": "application/json",
|
|
27600
|
+
Authorization: `Bearer ${apiKey}`,
|
|
27601
|
+
"X-Sno-Source": "sno-station",
|
|
27602
|
+
"X-Sno-Workload": "station-rerank"
|
|
27603
|
+
},
|
|
27604
|
+
body: {
|
|
27605
|
+
query,
|
|
27606
|
+
texts: candidates,
|
|
27607
|
+
raw_scores: true
|
|
27608
|
+
}
|
|
27609
|
+
};
|
|
27660
27610
|
}
|
|
27661
|
-
|
|
27662
|
-
|
|
27663
|
-
const parseItems = (items
|
|
27611
|
+
/** Sno's reranker answers a list of `{index, score}`, bare or under `results` / `data`. */
|
|
27612
|
+
function parseRerankResponse(data) {
|
|
27613
|
+
const parseItems = (items) => {
|
|
27664
27614
|
if (!Array.isArray(items)) return void 0;
|
|
27665
27615
|
const parsed = [];
|
|
27666
27616
|
for (const raw of items) {
|
|
27667
27617
|
const index = typeof raw?.index === "number" ? raw.index : Number(raw?.index);
|
|
27668
27618
|
if (!Number.isFinite(index)) continue;
|
|
27669
27619
|
let score;
|
|
27670
|
-
for (const key of
|
|
27620
|
+
for (const key of ["score", "relevance_score"]) {
|
|
27671
27621
|
const value = raw?.[key];
|
|
27672
27622
|
const n = typeof value === "number" ? value : Number(value);
|
|
27673
27623
|
if (Number.isFinite(n)) {
|
|
@@ -27684,18 +27634,7 @@ function parseRerankResponse(provider, data) {
|
|
|
27684
27634
|
return parsed.length > 0 ? parsed : void 0;
|
|
27685
27635
|
};
|
|
27686
27636
|
const objectData = data && typeof data === "object" && !Array.isArray(data) ? data : void 0;
|
|
27687
|
-
|
|
27688
|
-
case "tei":
|
|
27689
|
-
case "sno-gpu": return parseItems(data, ["score", "relevance_score"]) ?? parseItems(objectData?.results, ["score", "relevance_score"]) ?? parseItems(objectData?.data, ["score", "relevance_score"]);
|
|
27690
|
-
case "dashscope": {
|
|
27691
|
-
const output = objectData?.output;
|
|
27692
|
-
if (output) return parseItems(output.results, ["relevance_score", "score"]);
|
|
27693
|
-
return parseItems(objectData?.results, ["relevance_score", "score"]);
|
|
27694
|
-
}
|
|
27695
|
-
case "pinecone": return parseItems(objectData?.data, ["score", "relevance_score"]) ?? parseItems(objectData?.results, ["score", "relevance_score"]);
|
|
27696
|
-
case "voyage": return parseItems(objectData?.data, ["relevance_score", "score"]) ?? parseItems(objectData?.results, ["relevance_score", "score"]);
|
|
27697
|
-
default: return parseItems(objectData?.results, ["relevance_score", "score"]) ?? parseItems(objectData?.data, ["relevance_score", "score"]);
|
|
27698
|
-
}
|
|
27637
|
+
return parseItems(data) ?? parseItems(objectData?.results) ?? parseItems(objectData?.data);
|
|
27699
27638
|
}
|
|
27700
27639
|
//#endregion
|
|
27701
27640
|
//#region src/engine/retrieval/retriever-rerank.ts
|
|
@@ -27763,11 +27702,9 @@ async function fetchRerankWithRetry(send, stop) {
|
|
|
27763
27702
|
for (let attempt = 1; attempt <= RERANK_TRANSIENT_ATTEMPTS; attempt += 1) {
|
|
27764
27703
|
let retryDelayMs = RERANK_TRANSIENT_BACKOFF_MS * attempt;
|
|
27765
27704
|
try {
|
|
27766
|
-
const
|
|
27767
|
-
|
|
27768
|
-
|
|
27769
|
-
data: await response.json()
|
|
27770
|
-
};
|
|
27705
|
+
const reply = await send();
|
|
27706
|
+
const { response } = reply;
|
|
27707
|
+
if (response.ok) return reply;
|
|
27771
27708
|
if (!RERANK_TRANSIENT_STATUSES.has(response.status) || attempt === RERANK_TRANSIENT_ATTEMPTS) return { response };
|
|
27772
27709
|
if (response.status === 429) {
|
|
27773
27710
|
const retryAfter = response.headers.get("retry-after");
|
|
@@ -27799,13 +27736,12 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27799
27736
|
async rerank(query, candidates, queryVector, options) {
|
|
27800
27737
|
if (candidates.length === 0) return { candidates };
|
|
27801
27738
|
if (this.config.rerank === "none") return { candidates };
|
|
27802
|
-
const
|
|
27803
|
-
|
|
27804
|
-
if (this.config.rerank === "
|
|
27805
|
-
|
|
27806
|
-
const rerankEndpoint = this.config.rerankEndpoint ?? RERANK_DEFAULT_ENDPOINTS[provider];
|
|
27739
|
+
const unranked = () => this.rerankLightweight(candidates, queryVector);
|
|
27740
|
+
if (this.config.rerank === "cross-encoder" && !this.config.rerankApiKey) throw new RetrievalError("rerank \"cross-encoder\" requires retrieval.rerankApiKey; set the key, or set retrieval.rerank to \"lightweight\" to choose the local ranker");
|
|
27741
|
+
if (this.config.rerank === "lightweight" || !this.config.rerankApiKey) return await this.rerankLocalModel(query, this.rerankLightweight(candidates, queryVector), options?.deadlineAt, options?.signal);
|
|
27742
|
+
const rerankEndpoint = this.config.rerankEndpoint;
|
|
27807
27743
|
if (!rerankEndpoint) {
|
|
27808
|
-
log$4.warn("rerank skipped: no
|
|
27744
|
+
log$4.warn("rerank skipped: no reranker address", {}, {
|
|
27809
27745
|
event_name: "memory.retriever_rerank.diagnostic",
|
|
27810
27746
|
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27811
27747
|
function: "rerank",
|
|
@@ -27813,15 +27749,12 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27813
27749
|
});
|
|
27814
27750
|
return {
|
|
27815
27751
|
candidates: unranked(),
|
|
27816
|
-
fallback: {
|
|
27817
|
-
reason: "no_endpoint",
|
|
27818
|
-
provider
|
|
27819
|
-
}
|
|
27752
|
+
fallback: { reason: "no_endpoint" }
|
|
27820
27753
|
};
|
|
27821
27754
|
}
|
|
27822
27755
|
const rerankTimeoutMs = this.config.rerankTimeoutMs ?? 15e3;
|
|
27823
|
-
const
|
|
27824
|
-
const stepStop =
|
|
27756
|
+
const stepBudget = AbortSignal.timeout(Math.max(0, Math.floor(options?.deadlineAt === void 0 ? rerankTimeoutMs : options.deadlineAt - Date.now())));
|
|
27757
|
+
const stepStop = options?.signal ? AbortSignal.any([options.signal, stepBudget]) : stepBudget;
|
|
27825
27758
|
const rerankApiKey = this.config.rerankApiKey;
|
|
27826
27759
|
const maxCandidates = this.config.rerankMaxCandidates;
|
|
27827
27760
|
const overCap = maxCandidates !== void 0 && candidates.length > maxCandidates;
|
|
@@ -27843,10 +27776,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27843
27776
|
});
|
|
27844
27777
|
return {
|
|
27845
27778
|
candidates: unranked(),
|
|
27846
|
-
fallback: {
|
|
27847
|
-
reason: "query_over_window",
|
|
27848
|
-
provider
|
|
27849
|
-
}
|
|
27779
|
+
fallback: { reason: "query_over_window" }
|
|
27850
27780
|
};
|
|
27851
27781
|
}
|
|
27852
27782
|
let truncatedCandidates = 0;
|
|
@@ -27869,20 +27799,54 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27869
27799
|
const runBatch = async (start) => {
|
|
27870
27800
|
let batchTexts = rerankTexts.slice(start, start + batchSize);
|
|
27871
27801
|
for (let pass = 0;; pass += 1) {
|
|
27872
|
-
const { headers, body } = buildRerankRequest(
|
|
27873
|
-
const
|
|
27874
|
-
|
|
27875
|
-
|
|
27876
|
-
|
|
27877
|
-
|
|
27878
|
-
|
|
27879
|
-
|
|
27880
|
-
|
|
27881
|
-
|
|
27802
|
+
const { headers, body } = buildRerankRequest(rerankApiKey, query, batchTexts);
|
|
27803
|
+
const sendAttempt = async () => {
|
|
27804
|
+
const clientRequestId = randomUUID();
|
|
27805
|
+
const attemptStarted = performance.now();
|
|
27806
|
+
let outcome = "failed";
|
|
27807
|
+
let statusCode;
|
|
27808
|
+
try {
|
|
27809
|
+
const attempt = await fetch(rerankEndpoint, {
|
|
27810
|
+
method: "POST",
|
|
27811
|
+
headers: {
|
|
27812
|
+
...headers,
|
|
27813
|
+
"X-Request-ID": clientRequestId
|
|
27814
|
+
},
|
|
27815
|
+
body: JSON.stringify(body),
|
|
27816
|
+
signal: AbortSignal.any([AbortSignal.timeout(rerankTimeoutMs), stepStop])
|
|
27817
|
+
});
|
|
27818
|
+
statusCode = attempt.status;
|
|
27819
|
+
if (!attempt.ok) {
|
|
27820
|
+
outcome = "http_error";
|
|
27821
|
+
return { response: attempt };
|
|
27822
|
+
}
|
|
27823
|
+
const data = await attempt.json();
|
|
27824
|
+
outcome = "success";
|
|
27825
|
+
return {
|
|
27826
|
+
response: attempt,
|
|
27827
|
+
data
|
|
27828
|
+
};
|
|
27829
|
+
} catch (error) {
|
|
27830
|
+
outcome = isRerankTimeout(error) ? "timeout" : "failed";
|
|
27831
|
+
throw error;
|
|
27832
|
+
} finally {
|
|
27833
|
+
log$4.info("Rerank request completed", {
|
|
27834
|
+
outcome,
|
|
27835
|
+
status_code: statusCode ?? "unavailable",
|
|
27836
|
+
duration_ms: performance.now() - attemptStarted,
|
|
27837
|
+
texts_sent: batchTexts.length,
|
|
27838
|
+
client_request_id: clientRequestId
|
|
27839
|
+
}, {
|
|
27840
|
+
event_name: "rerank.request.completed",
|
|
27841
|
+
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
27842
|
+
function: "runBatch",
|
|
27843
|
+
site_id: "rerank.request.completed"
|
|
27844
|
+
});
|
|
27845
|
+
}
|
|
27846
|
+
};
|
|
27847
|
+
const { response, data } = await fetchRerankWithRetry(sendAttempt, stepStop);
|
|
27882
27848
|
if (!response.ok) {
|
|
27883
27849
|
const retryAfter = response.headers.get("retry-after");
|
|
27884
|
-
const fatalError = buildRerankHttpError(response.status);
|
|
27885
|
-
if (fatalError && provider !== "sno-gpu") throw fatalError;
|
|
27886
27850
|
const errorBody = await response.text().catch(() => "<unreadable body>");
|
|
27887
27851
|
const refusal = pass === 0 ? parseOverWindowRefusal(errorBody) : void 0;
|
|
27888
27852
|
if (refusal) {
|
|
@@ -27924,10 +27888,9 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27924
27888
|
});
|
|
27925
27889
|
return "http_error";
|
|
27926
27890
|
}
|
|
27927
|
-
const parsed = parseRerankResponse(
|
|
27891
|
+
const parsed = parseRerankResponse(data);
|
|
27928
27892
|
if (!parsed) {
|
|
27929
27893
|
log$4.warn("rerank API returned unparseable response", {
|
|
27930
|
-
provider,
|
|
27931
27894
|
endpoint_hash: createHash("sha256").update(rerankEndpoint).digest("hex"),
|
|
27932
27895
|
batchStart: start
|
|
27933
27896
|
}, {
|
|
@@ -27959,10 +27922,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27959
27922
|
for (const outcome of settled) if (outcome.status === "rejected") throw outcome.reason;
|
|
27960
27923
|
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value === "string") return {
|
|
27961
27924
|
candidates: unranked(),
|
|
27962
|
-
fallback: {
|
|
27963
|
-
reason: outcome.value,
|
|
27964
|
-
provider
|
|
27965
|
-
}
|
|
27925
|
+
fallback: { reason: outcome.value }
|
|
27966
27926
|
};
|
|
27967
27927
|
for (const outcome of settled) if (outcome.status === "fulfilled" && typeof outcome.value !== "string") items.push(...outcome.value);
|
|
27968
27928
|
}
|
|
@@ -27977,9 +27937,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27977
27937
|
const candidate = toRerank[item.index];
|
|
27978
27938
|
if (!candidate) continue;
|
|
27979
27939
|
const sourceScore = this.getRerankSourceScore(candidate);
|
|
27980
|
-
|
|
27981
|
-
if (provider === "tei" || provider === "sno-gpu") crossScore = 1 / (1 + Math.exp(-item.score));
|
|
27982
|
-
const blendedScore = clamp01(crossScore * blendCross + sourceScore * blendVector, 0);
|
|
27940
|
+
const blendedScore = clamp01(1 / (1 + Math.exp(-item.score)) * blendCross + sourceScore * blendVector, 0);
|
|
27983
27941
|
reranked.push({
|
|
27984
27942
|
...candidate,
|
|
27985
27943
|
score: blendedScore,
|
|
@@ -27997,8 +27955,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
27997
27955
|
log$4.debug("reranked", {
|
|
27998
27956
|
totalCandidateCount: candidates.length,
|
|
27999
27957
|
sentToRerankCount: toRerank.length,
|
|
28000
|
-
returnedCount: reranked.length
|
|
28001
|
-
provider
|
|
27958
|
+
returnedCount: reranked.length
|
|
28002
27959
|
}, {
|
|
28003
27960
|
event_name: "memory.retriever_rerank.diagnostic",
|
|
28004
27961
|
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
@@ -28041,10 +27998,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28041
27998
|
}
|
|
28042
27999
|
return {
|
|
28043
28000
|
candidates: unranked(),
|
|
28044
|
-
fallback: {
|
|
28045
|
-
reason,
|
|
28046
|
-
provider
|
|
28047
|
-
}
|
|
28001
|
+
fallback: { reason }
|
|
28048
28002
|
};
|
|
28049
28003
|
}
|
|
28050
28004
|
},
|
|
@@ -28053,8 +28007,8 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28053
28007
|
if (candidates.length === 0) return candidates;
|
|
28054
28008
|
const chunkIds = candidates.map((c) => c.chunkId).filter((id) => id !== void 0);
|
|
28055
28009
|
const vectorMap = chunkIds.length > 0 ? this.store.getVectorsByIds(chunkIds) : /* @__PURE__ */ new Map();
|
|
28056
|
-
const wF = this.config.lightweightFusionWeight ?? .
|
|
28057
|
-
const wC = this.config.lightweightCosineWeight ?? .
|
|
28010
|
+
const wF = this.config.lightweightFusionWeight ?? .1;
|
|
28011
|
+
const wC = this.config.lightweightCosineWeight ?? .9;
|
|
28058
28012
|
let blendedCount = 0;
|
|
28059
28013
|
let dimMismatchCount = 0;
|
|
28060
28014
|
const reranked = candidates.map((candidate) => {
|
|
@@ -28114,6 +28068,58 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28114
28068
|
return a.entry.id.localeCompare(b.entry.id);
|
|
28115
28069
|
});
|
|
28116
28070
|
},
|
|
28071
|
+
/**
|
|
28072
|
+
* The local reranker model reorders the first candidates of the local ranking. Their order is unchanged while the
|
|
28073
|
+
* model is not loaded yet (the first call starts loading it), past the caller's deadline, and after a cancel.
|
|
28074
|
+
*/
|
|
28075
|
+
async rerankLocalModel(query, ordered, deadlineAt, signal) {
|
|
28076
|
+
if (ordered.length < 2 || signal?.aborted || deadlineAt !== void 0 && Date.now() >= deadlineAt) return { candidates: ordered };
|
|
28077
|
+
const head = ordered.slice(0, 15);
|
|
28078
|
+
const started = performance.now();
|
|
28079
|
+
const budgetMs = deadlineAt === void 0 ? this.config.rerankTimeoutMs ?? 15e3 : Math.max(0, Math.floor(deadlineAt - Date.now()));
|
|
28080
|
+
const stop = signal ? AbortSignal.any([signal, AbortSignal.timeout(budgetMs)]) : AbortSignal.timeout(budgetMs);
|
|
28081
|
+
const scoring = this.embedder.scoreRelevance(query, head.map((r) => r.entry.text), stop).catch((error) => {
|
|
28082
|
+
log$4.warn("local reranker failed; recall keeps the local ranking order", { error }, {
|
|
28083
|
+
event_name: "memory.retriever_rerank.diagnostic",
|
|
28084
|
+
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
28085
|
+
function: "rerankLocalModel",
|
|
28086
|
+
site_id: "retrieval.retriever-rerank.rerankLocalModel.failed"
|
|
28087
|
+
});
|
|
28088
|
+
});
|
|
28089
|
+
const logits = await Promise.race([scoring, new Promise((resolve) => stop.addEventListener("abort", () => resolve(void 0), { once: true }))]);
|
|
28090
|
+
if (!logits || signal?.aborted) return { candidates: ordered };
|
|
28091
|
+
const blended = head.map((candidate, index) => ({
|
|
28092
|
+
candidate,
|
|
28093
|
+
value: logits[index] ?? Number.NEGATIVE_INFINITY
|
|
28094
|
+
}));
|
|
28095
|
+
blended.sort((a, b) => b.value - a.value || a.candidate.entry.id.localeCompare(b.candidate.entry.id));
|
|
28096
|
+
const slots = head.map((candidate) => candidate.score).sort((a, b) => b - a);
|
|
28097
|
+
const rescored = blended.map(({ candidate }, index) => {
|
|
28098
|
+
const score = slots[index] ?? candidate.score;
|
|
28099
|
+
return {
|
|
28100
|
+
...candidate,
|
|
28101
|
+
score,
|
|
28102
|
+
rerankScore: score,
|
|
28103
|
+
sources: {
|
|
28104
|
+
...candidate.sources,
|
|
28105
|
+
reranked: { score }
|
|
28106
|
+
}
|
|
28107
|
+
};
|
|
28108
|
+
});
|
|
28109
|
+
log$4.debug("local reranker applied", {
|
|
28110
|
+
scored: head.length,
|
|
28111
|
+
duration_ms: performance.now() - started
|
|
28112
|
+
}, {
|
|
28113
|
+
event_name: "memory.retriever_rerank.diagnostic",
|
|
28114
|
+
file: "packages/memory/src/engine/retrieval/retriever-rerank.ts",
|
|
28115
|
+
function: "rerankLocalModel",
|
|
28116
|
+
site_id: "retrieval.retriever-rerank.rerankLocalModel.applied"
|
|
28117
|
+
});
|
|
28118
|
+
return {
|
|
28119
|
+
candidates: [...rescored, ...ordered.slice(head.length)],
|
|
28120
|
+
modelOrder: blended.map(({ candidate }) => candidate.entry.id)
|
|
28121
|
+
};
|
|
28122
|
+
},
|
|
28117
28123
|
getRerankSourceScore(result) {
|
|
28118
28124
|
return clamp01(Math.max(result.sources.bm25?.score ?? 0, result.sources.vector?.score ?? 0), 0);
|
|
28119
28125
|
}
|
|
@@ -28305,8 +28311,21 @@ function tracedStage(trace, name, skipReason, run, input) {
|
|
|
28305
28311
|
trace.endStage(output.map((result) => result.entry.id), output.map((result) => result.score), skipReason === void 0 ? void 0 : { skipped: skipReason });
|
|
28306
28312
|
return output;
|
|
28307
28313
|
}
|
|
28314
|
+
/** The candidates the local reranker model scored take their own scores, highest first, in its order. */
|
|
28315
|
+
function orderByLocalModel(results, modelOrder) {
|
|
28316
|
+
const present = new Set(results.map((result) => result.entry.id));
|
|
28317
|
+
const order = modelOrder.filter((id) => present.has(id));
|
|
28318
|
+
if (order.length < 2) return results;
|
|
28319
|
+
const judged = new Set(order);
|
|
28320
|
+
const slots = results.filter((result) => judged.has(result.entry.id)).map((result) => result.score).sort((a, b) => b - a);
|
|
28321
|
+
const scores = new Map(order.map((id, index) => [id, slots[index] ?? 0]));
|
|
28322
|
+
return results.map((result) => ({
|
|
28323
|
+
...result,
|
|
28324
|
+
score: scores.get(result.entry.id) ?? result.score
|
|
28325
|
+
})).sort((a, b) => b.score - a.score);
|
|
28326
|
+
}
|
|
28308
28327
|
Object.assign(MemoryRetriever.prototype, {
|
|
28309
|
-
applyScoringPipeline(results, trace, limit = results.length) {
|
|
28328
|
+
applyScoringPipeline(results, trace, limit = results.length, modelOrder) {
|
|
28310
28329
|
const stage = (name, skipReason, run, input) => tracedStage(trace, name, skipReason, run, input);
|
|
28311
28330
|
const temporalOff = !this.config.temporalWeighting;
|
|
28312
28331
|
let scored = stage("recency_boost", temporalOff ? "temporalWeighting" : this.config.recencyHalfLifeDays <= 0 ? "recencyHalfLifeDays" : this.config.recencyWeight <= 0 ? "recencyWeight" : void 0, (input) => temporalOff ? input : this.applyRecencyBoost(input), results);
|
|
@@ -28314,6 +28333,7 @@ Object.assign(MemoryRetriever.prototype, {
|
|
|
28314
28333
|
scored = stage("length_normalization", this.config.lengthNormAnchor <= 0 ? "lengthNormAnchor" : void 0, (input) => this.applyLengthNormalization(input), scored);
|
|
28315
28334
|
scored = stage("time_decay", temporalOff ? "temporalWeighting" : this.config.timeDecayHalfLifeDays <= 0 ? "timeDecayHalfLifeDays" : void 0, (input) => temporalOff ? input : this.applyTimeDecay(input), scored);
|
|
28316
28335
|
scored = stage("retention_boost", temporalOff ? "temporalWeighting" : this.config.recallLifecycle?.retentionScorer === true ? void 0 : "recallLifecycle.retentionScorer", (input) => temporalOff ? input : this.applyRetentionBoost(input), scored);
|
|
28336
|
+
scored = stage("local_model_order", modelOrder ? void 0 : "modelOrder", (input) => modelOrder ? orderByLocalModel(input, modelOrder) : input, scored);
|
|
28317
28337
|
scored = stage("hard_min_score", void 0, (input) => input.filter((result) => result.score >= this.config.hardMinScore), scored);
|
|
28318
28338
|
const mmrOff = experimentMmrDisabled();
|
|
28319
28339
|
scored = stage("mmr_diversity", mmrOff ? "experiment.disableMmr" : void 0, (input) => {
|