dsh-diary-memory 0.1.0 → 0.1.1
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 +56 -13
- package/cordis.patch.yml +0 -1
- package/lib/bailian-client.js +8 -3
- package/lib/bailian-client.js.map +1 -1
- package/lib/client/controller.d.ts +32 -0
- package/lib/client/controller.js +91 -0
- package/lib/client/controller.js.map +1 -0
- package/lib/client/index.d.ts +5 -0
- package/lib/client/index.js +16 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/page.d.ts +5 -0
- package/lib/client/page.js +19 -0
- package/lib/client/page.js.map +1 -0
- package/lib/client.js +274 -0
- package/lib/client.js.map +7 -0
- package/lib/config.d.ts +59 -1
- package/lib/config.js +27 -4
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/model-parameters.d.ts +7 -0
- package/lib/model-parameters.js +38 -0
- package/lib/model-parameters.js.map +1 -0
- package/lib/orchestrator.js +1 -1
- package/lib/orchestrator.js.map +1 -1
- package/lib/retrieval-service.d.ts +12 -3
- package/lib/retrieval-service.js +25 -13
- package/lib/retrieval-service.js.map +1 -1
- package/package.json +124 -27
- package/src/bailian-client.ts +7 -3
- package/src/client/controller.ts +81 -0
- package/src/client/index.ts +21 -0
- package/src/client/page.tsx +68 -0
- package/src/config.ts +35 -4
- package/src/index.ts +9 -5
- package/src/model-parameters.ts +32 -0
- package/src/orchestrator.ts +1 -1
- package/src/retrieval-service.ts +27 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-parameters.js","sourceRoot":"","sources":["../src/model-parameters.ts"],"names":[],"mappings":"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"}
|
package/lib/orchestrator.js
CHANGED
|
@@ -74,7 +74,7 @@ export class DiaryOrchestrator extends BasicCompactionEngine {
|
|
|
74
74
|
if (!await this.ctx.sessions.flush(agent.session))
|
|
75
75
|
throw new Error('缺少会话持久化提供方,拒绝压缩');
|
|
76
76
|
const span = captureSpan(agent.session, input.messages);
|
|
77
|
-
const { config, store, client } = this.memory;
|
|
77
|
+
const { config, store, client } = this.memory.snapshot();
|
|
78
78
|
if (!config.apiKey)
|
|
79
79
|
throw new Error('请先配置百炼 apiKey;原会话上下文已保留');
|
|
80
80
|
const existing = store.findSource(config.namespace, agent.session.id, span.sourceHash, client.embeddingKey);
|
package/lib/orchestrator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,16 +33,25 @@ export interface RecallHit {
|
|
|
33
33
|
score: number;
|
|
34
34
|
}
|
|
35
35
|
export declare class RetrievalService extends Service {
|
|
36
|
-
readonly config: ResolvedConfig;
|
|
37
|
-
readonly client: BailianClient;
|
|
38
36
|
readonly store: MemoryStore;
|
|
39
37
|
readonly lifetime: AbortController;
|
|
40
38
|
private readonly jobs;
|
|
41
39
|
private readonly recovery;
|
|
42
|
-
|
|
40
|
+
private readonly configuration;
|
|
41
|
+
private readonly fixedClient?;
|
|
42
|
+
private cachedClient?;
|
|
43
|
+
constructor(ctx: Context, config: ResolvedConfig | (() => ResolvedConfig), dependencies?: {
|
|
43
44
|
store?: MemoryStore;
|
|
44
45
|
client?: BailianClient;
|
|
45
46
|
});
|
|
47
|
+
get config(): ResolvedConfig;
|
|
48
|
+
get client(): BailianClient;
|
|
49
|
+
/** One operation keeps its route and vector space even if settings change in flight. */
|
|
50
|
+
snapshot(): {
|
|
51
|
+
config: ResolvedConfig;
|
|
52
|
+
client: BailianClient;
|
|
53
|
+
store: MemoryStore;
|
|
54
|
+
};
|
|
46
55
|
initialize(): Promise<void>;
|
|
47
56
|
stateOf(session: Session): DiaryProjectionState;
|
|
48
57
|
track<T>(operation: () => Promise<T>): Promise<T>;
|
package/lib/retrieval-service.js
CHANGED
|
@@ -5,21 +5,32 @@ import { MemoryStore } from './memory-store.js';
|
|
|
5
5
|
import { renderDiary } from './diary.js';
|
|
6
6
|
import { diaryProjection } from './projection.js';
|
|
7
7
|
export class RetrievalService extends Service {
|
|
8
|
-
config;
|
|
9
|
-
client;
|
|
10
8
|
store;
|
|
11
9
|
lifetime = new AbortController();
|
|
12
10
|
jobs = new Set();
|
|
13
11
|
recovery = new WeakMap();
|
|
12
|
+
configuration;
|
|
13
|
+
fixedClient;
|
|
14
|
+
cachedClient;
|
|
14
15
|
constructor(ctx, config, dependencies = {}) {
|
|
15
16
|
super(ctx, 'diaryMemory');
|
|
16
|
-
this.
|
|
17
|
-
this.store = dependencies.store ?? new MemoryStore(config.databasePath);
|
|
18
|
-
this.
|
|
17
|
+
this.configuration = typeof config === 'function' ? config : () => config;
|
|
18
|
+
this.store = dependencies.store ?? new MemoryStore(this.config.databasePath);
|
|
19
|
+
this.fixedClient = dependencies.client;
|
|
19
20
|
ctx.effect(() => () => this.dispose(), 'diaryMemory.lifecycle()');
|
|
20
21
|
}
|
|
22
|
+
get config() { return this.configuration(); }
|
|
23
|
+
get client() { return this.snapshot().client; }
|
|
24
|
+
/** One operation keeps its route and vector space even if settings change in flight. */
|
|
25
|
+
snapshot() {
|
|
26
|
+
const config = this.config;
|
|
27
|
+
const key = JSON.stringify([config.apiKey, config.baseUrl, config.embeddingModel, config.embeddingDimensions, config.embeddingParameters, config.rerankModel, config.rerankParameters, config.timeoutMs, config.retries]);
|
|
28
|
+
if (!this.fixedClient && this.cachedClient?.key !== key)
|
|
29
|
+
this.cachedClient = { key, client: new BailianClient(config, { signal: this.lifetime.signal }) };
|
|
30
|
+
return { config, client: this.fixedClient ?? this.cachedClient.client, store: this.store };
|
|
31
|
+
}
|
|
21
32
|
async initialize() {
|
|
22
|
-
this.ctx.sessionProjections.register(diaryProjection);
|
|
33
|
+
await this.ctx.sessionProjections.register(diaryProjection);
|
|
23
34
|
this.ctx.on('session/created', session => {
|
|
24
35
|
void this.track(() => this.reconcile(session)).catch(() => this.ctx.logger.warn('日记恢复未完成;保留待提交记录,下次使用时重试'));
|
|
25
36
|
});
|
|
@@ -53,25 +64,26 @@ export class RetrievalService extends Service {
|
|
|
53
64
|
}
|
|
54
65
|
recall(query, options = {}) {
|
|
55
66
|
return this.track(async () => {
|
|
67
|
+
const { config, client } = this.snapshot();
|
|
56
68
|
const text = query.trim();
|
|
57
69
|
if (!text || text.length > 8000)
|
|
58
70
|
throw new TypeError('recall query 必须为 1–8000 字符');
|
|
59
|
-
const limit = options.limit ??
|
|
60
|
-
if (!Number.isInteger(limit) || limit < 1 || limit >
|
|
71
|
+
const limit = options.limit ?? config.recallCount;
|
|
72
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > config.candidateCount)
|
|
61
73
|
throw new TypeError('recall limit 超出候选数量');
|
|
62
74
|
const signal = AbortSignal.any([this.lifetime.signal, ...options.signal ? [options.signal] : []]);
|
|
63
75
|
signal.throwIfAborted();
|
|
64
|
-
const namespace =
|
|
65
|
-
if (!this.store.count(namespace,
|
|
76
|
+
const namespace = config.namespace;
|
|
77
|
+
if (!this.store.count(namespace, client.embeddingKey)) {
|
|
66
78
|
if (this.store.count(namespace))
|
|
67
79
|
throw new Error('已有日记使用不同的 embedding 模型、维度或端点,请使用原向量配置或重新索引');
|
|
68
80
|
return [];
|
|
69
81
|
}
|
|
70
|
-
const vector = await
|
|
71
|
-
const candidates = this.store.search(vector, { namespace, embeddingKey:
|
|
82
|
+
const vector = await client.embed(text, { textType: 'query', signal });
|
|
83
|
+
const candidates = this.store.search(vector, { namespace, embeddingKey: client.embeddingKey, limit: config.candidateCount, sessionId: options.sessionId });
|
|
72
84
|
if (!candidates.length)
|
|
73
85
|
return [];
|
|
74
|
-
const ranking = await
|
|
86
|
+
const ranking = await client.rerank(text, candidates.map(item => item.search_text), { topN: Math.min(limit, candidates.length), signal });
|
|
75
87
|
signal.throwIfAborted();
|
|
76
88
|
return ranking.map(item => {
|
|
77
89
|
const match = candidates[item.index];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval-service.js","sourceRoot":"","sources":["../src/retrieval-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAqBjD,MAAM,OAAO,gBAAiB,SAAQ,OAAO;IAClC,
|
|
1
|
+
{"version":3,"file":"retrieval-service.js","sourceRoot":"","sources":["../src/retrieval-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-diary-memory",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "为 DSH 的陪伴与个人数字分身提供有温度、可演化的日记记忆、百炼检索和安全压缩。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
7
7
|
"types": "./lib/index.d.ts",
|
|
8
8
|
"license": "MIT",
|
|
9
|
-
"
|
|
10
|
-
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/cyhddyx/dsh-diary-memory.git"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/cyhddyx/dsh-diary-memory#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/cyhddyx/dsh-diary-memory/issues"
|
|
16
|
+
},
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.15",
|
|
19
|
+
"dsh": ">=0.2.1-rc.2 <0.3.0"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"lib",
|
|
23
|
+
"src",
|
|
24
|
+
"locale",
|
|
25
|
+
"icon.svg",
|
|
26
|
+
"cordis.patch.yml",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
11
30
|
"exports": {
|
|
12
|
-
"
|
|
31
|
+
"./client": {
|
|
32
|
+
"types": "./lib/client/index.d.ts",
|
|
33
|
+
"default": "./lib/client.js"
|
|
34
|
+
},
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./lib/index.d.ts",
|
|
37
|
+
"default": "./lib/index.js"
|
|
38
|
+
},
|
|
13
39
|
"./compaction": "./lib/orchestrator.js",
|
|
14
40
|
"./compaction/locale/*.json": "./locale/compaction/*.json",
|
|
15
41
|
"./compaction/icon": "./icon.svg",
|
|
@@ -23,51 +49,122 @@
|
|
|
23
49
|
"./package.json": "./package.json"
|
|
24
50
|
},
|
|
25
51
|
"scripts": {
|
|
26
|
-
"build": "tsc -p tsconfig.json",
|
|
52
|
+
"build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
|
|
27
53
|
"check": "tsc -p tsconfig.json --noEmit",
|
|
28
|
-
"test": "
|
|
54
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
29
55
|
"prepack": "npm run build"
|
|
30
56
|
},
|
|
31
|
-
"dependencies": {
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"better-sqlite3": "^12.4.1",
|
|
59
|
+
"zod": "4.4.3"
|
|
60
|
+
},
|
|
32
61
|
"peerDependencies": {
|
|
33
62
|
"@deepseek-ai/cordis": "~4.0.5",
|
|
34
|
-
"@deepseek-ai/
|
|
35
|
-
"@deepseek-ai/dsh-
|
|
36
|
-
"@deepseek-ai/dsh-compaction": "0.2.1-rc.3",
|
|
37
|
-
"@deepseek-ai/dsh-
|
|
38
|
-
"@deepseek-ai/dsh-
|
|
39
|
-
"@deepseek-ai/dsh-session": "0.2.1-rc.3",
|
|
40
|
-
"@deepseek-ai/dsh-
|
|
41
|
-
"@deepseek-ai/dsh-tools": "0.2.1-rc.3"
|
|
63
|
+
"@deepseek-ai/dsh-agent": ">=0.2.1-rc.2 <0.3.0",
|
|
64
|
+
"@deepseek-ai/dsh-compaction": ">=0.2.1-rc.2 <0.3.0",
|
|
65
|
+
"@deepseek-ai/dsh-compaction-basic": ">=0.2.1-rc.2 <0.3.0",
|
|
66
|
+
"@deepseek-ai/dsh-llm": ">=0.2.1-rc.2 <0.3.0",
|
|
67
|
+
"@deepseek-ai/dsh-session": ">=0.2.1-rc.2 <0.3.0",
|
|
68
|
+
"@deepseek-ai/dsh-session-projection": ">=0.2.1-rc.2 <0.3.0",
|
|
69
|
+
"@deepseek-ai/dsh-settings": ">=0.2.1-rc.2 <0.3.0",
|
|
70
|
+
"@deepseek-ai/dsh-tools": ">=0.2.1-rc.2 <0.3.0",
|
|
71
|
+
"@deepseek-ai/schemastery": "~3.18.5"
|
|
42
72
|
},
|
|
43
73
|
"peerDependenciesMeta": {
|
|
44
|
-
"@deepseek-ai/cordis": {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"@deepseek-ai/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"@deepseek-ai/dsh-
|
|
51
|
-
|
|
52
|
-
|
|
74
|
+
"@deepseek-ai/cordis": {
|
|
75
|
+
"optional": true
|
|
76
|
+
},
|
|
77
|
+
"@deepseek-ai/schemastery": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"@deepseek-ai/dsh-agent": {
|
|
81
|
+
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"@deepseek-ai/dsh-compaction": {
|
|
84
|
+
"optional": true
|
|
85
|
+
},
|
|
86
|
+
"@deepseek-ai/dsh-compaction-basic": {
|
|
87
|
+
"optional": true
|
|
88
|
+
},
|
|
89
|
+
"@deepseek-ai/dsh-llm": {
|
|
90
|
+
"optional": true
|
|
91
|
+
},
|
|
92
|
+
"@deepseek-ai/dsh-session": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
95
|
+
"@deepseek-ai/dsh-session-projection": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
98
|
+
"@deepseek-ai/dsh-tools": {
|
|
99
|
+
"optional": true
|
|
100
|
+
},
|
|
101
|
+
"@deepseek-ai/dsh-settings": {
|
|
102
|
+
"optional": true
|
|
103
|
+
}
|
|
53
104
|
},
|
|
54
105
|
"devDependencies": {
|
|
55
106
|
"@deepseek-ai/cordis": "4.0.5",
|
|
56
|
-
"@deepseek-ai/
|
|
107
|
+
"@deepseek-ai/cosmokit": "1.8.6",
|
|
57
108
|
"@deepseek-ai/dsh-agent": "0.2.1-rc.3",
|
|
109
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.1-rc.3",
|
|
110
|
+
"@deepseek-ai/dsh-app-boot": "0.2.1-rc.3",
|
|
111
|
+
"@deepseek-ai/dsh-client-store": "0.2.1-rc.3",
|
|
112
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.3",
|
|
113
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.3",
|
|
114
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.1-rc.3",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.3",
|
|
58
116
|
"@deepseek-ai/dsh-compaction": "0.2.1-rc.3",
|
|
59
117
|
"@deepseek-ai/dsh-compaction-basic": "0.2.1-rc.3",
|
|
118
|
+
"@deepseek-ai/dsh-config-editor": "0.2.1-rc.3",
|
|
60
119
|
"@deepseek-ai/dsh-llm": "0.2.1-rc.3",
|
|
61
120
|
"@deepseek-ai/dsh-session": "0.2.1-rc.3",
|
|
62
121
|
"@deepseek-ai/dsh-session-projection": "0.2.1-rc.3",
|
|
122
|
+
"@deepseek-ai/dsh-settings": "0.2.1-rc.3",
|
|
63
123
|
"@deepseek-ai/dsh-token-meter": "0.2.1-rc.3",
|
|
64
124
|
"@deepseek-ai/dsh-tools": "0.2.1-rc.3",
|
|
125
|
+
"@deepseek-ai/schemastery": "3.18.5",
|
|
126
|
+
"@shikijs/langs": "4.4.3",
|
|
65
127
|
"@types/better-sqlite3": "^7.6.13",
|
|
66
128
|
"@types/node": "^24.0.0",
|
|
129
|
+
"@types/react": "18.3.31",
|
|
130
|
+
"@types/react-dom": "18.3.7",
|
|
131
|
+
"anser": "2.3.5",
|
|
132
|
+
"clsx": "2.1.1",
|
|
133
|
+
"diff": "9.0.0",
|
|
134
|
+
"esbuild": "0.28.2",
|
|
135
|
+
"immer": "10.2.0",
|
|
136
|
+
"katex": "0.18.7",
|
|
137
|
+
"mdast-util-from-markdown": "2.1.0",
|
|
138
|
+
"mdast-util-gfm": "3.1.0",
|
|
139
|
+
"mdast-util-math": "3.0.0",
|
|
140
|
+
"micromark-core-commonmark": "2.0.4",
|
|
141
|
+
"micromark-extension-gfm": "3.0.0",
|
|
142
|
+
"micromark-extension-math": "3.1.0",
|
|
143
|
+
"micromark-factory-space": "2.1.0",
|
|
144
|
+
"micromark-util-character": "2.1.1",
|
|
145
|
+
"micromark-util-classify-character": "2.0.1",
|
|
146
|
+
"micromark-util-sanitize-uri": "2.0.1",
|
|
147
|
+
"micromark-util-symbol": "2.0.1",
|
|
148
|
+
"micromark-util-types": "2.0.3",
|
|
149
|
+
"react": "18.3.1",
|
|
150
|
+
"react-dom": "18.3.1",
|
|
151
|
+
"semver": "7.8.5",
|
|
152
|
+
"shiki": "4.4.3",
|
|
153
|
+
"simple-icons": "16.31.0",
|
|
67
154
|
"typescript": "^5.9.3",
|
|
68
|
-
"yaml": "^2.8.1"
|
|
155
|
+
"yaml": "^2.8.1",
|
|
156
|
+
"zustand": "5.0.16"
|
|
69
157
|
},
|
|
70
158
|
"dsh": {
|
|
71
|
-
"
|
|
159
|
+
"client": {
|
|
160
|
+
"inject": [
|
|
161
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
162
|
+
"@deepseek-ai/dsh-client-ui-renderer"
|
|
163
|
+
],
|
|
164
|
+
"platform": "web"
|
|
165
|
+
},
|
|
166
|
+
"bundle": {
|
|
167
|
+
"patch": "./cordis.patch.yml"
|
|
168
|
+
}
|
|
72
169
|
}
|
|
73
170
|
}
|
package/src/bailian-client.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { setTimeout as delay } from 'node:timers/promises'
|
|
2
2
|
import type { ResolvedConfig } from './config.js'
|
|
3
|
+
import { stableParameters } from './model-parameters.js'
|
|
3
4
|
|
|
4
5
|
interface BailianFailure {
|
|
5
6
|
status?: number
|
|
@@ -38,7 +39,10 @@ export class BailianClient {
|
|
|
38
39
|
this.fetch = fetchImpl
|
|
39
40
|
this.signal = signal
|
|
40
41
|
// Model names alone do not identify the vector space across endpoints/dimensions.
|
|
41
|
-
|
|
42
|
+
const space: unknown[] = [config.baseUrl, config.embeddingModel, config.embeddingDimensions]
|
|
43
|
+
// Keep the original vector-space key when no extra parameters were chosen.
|
|
44
|
+
if (Object.keys(config.embeddingParameters).length) space.push(stableParameters(config.embeddingParameters))
|
|
45
|
+
this.embeddingKey = JSON.stringify(space)
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
async request(path: string, body: unknown, callerSignal?: AbortSignal): Promise<unknown> {
|
|
@@ -95,7 +99,7 @@ export class BailianClient {
|
|
|
95
99
|
const output = await this.request('/api/v1/services/embeddings/text-embedding/text-embedding', {
|
|
96
100
|
model: embeddingModel,
|
|
97
101
|
input: { texts: [text] },
|
|
98
|
-
parameters: { text_type: textType, dimension: embeddingDimensions },
|
|
102
|
+
parameters: { ...this.config.embeddingParameters, text_type: textType, dimension: embeddingDimensions },
|
|
99
103
|
}, signal) as { embeddings?: { text_index?: unknown; embedding?: unknown }[] }
|
|
100
104
|
if (output.embeddings?.length !== 1 || output.embeddings[0].text_index !== 0) throw new BailianError('百炼 embedding 的 text_index 无效')
|
|
101
105
|
return validateVector(output.embeddings[0].embedding, embeddingDimensions)
|
|
@@ -108,7 +112,7 @@ export class BailianClient {
|
|
|
108
112
|
const output = await this.request('/api/v1/services/rerank/text-rerank/text-rerank', {
|
|
109
113
|
model: this.config.rerankModel,
|
|
110
114
|
input: { query, documents },
|
|
111
|
-
parameters: {
|
|
115
|
+
parameters: { return_documents: false, ...this.config.rerankParameters, top_n: topN },
|
|
112
116
|
}, signal) as { results?: RerankResult[] }
|
|
113
117
|
if (!Array.isArray(output.results) || output.results.length !== topN) throw new BailianError('百炼 rerank 结果数量无效')
|
|
114
118
|
const seen = new Set()
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { SettingsFormModel, settingsTextField } from '@deepseek-ai/dsh-client-ui-primitives'
|
|
2
|
+
import type { SettingsFieldSpec, SettingsFieldState, SettingsFormScope, SettingsFormShell } from '@deepseek-ai/dsh-client-ui-primitives'
|
|
3
|
+
import type { SnapshotStore } from '@deepseek-ai/dsh-client-store'
|
|
4
|
+
import type { DiaryConfig } from '../config.js'
|
|
5
|
+
import { validateModelParameters } from '../model-parameters.js'
|
|
6
|
+
|
|
7
|
+
export const editableFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'candidateCount', 'recallCount', 'compressionRounds', 'retainRounds', 'autoRecall'] as const
|
|
8
|
+
export type EditableField = typeof editableFields[number]
|
|
9
|
+
export type FormValues = Partial<Pick<DiaryConfig, EditableField>>
|
|
10
|
+
export interface DiarySettingsState extends SettingsFormShell {
|
|
11
|
+
fields: Record<EditableField, SettingsFieldState>
|
|
12
|
+
keyConfigured: boolean
|
|
13
|
+
error: string | null
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function numberField(field: string, min: number, max: number): SettingsFieldSpec {
|
|
17
|
+
return {
|
|
18
|
+
field, format: value => typeof value === 'number' ? String(value) : '',
|
|
19
|
+
parse: text => !text.trim() ? { kind: 'clear' }
|
|
20
|
+
: Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: 'set', value: Number(text) } : undefined,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function parametersField(field: string, kind: 'embedding' | 'rerank'): SettingsFieldSpec {
|
|
24
|
+
return {
|
|
25
|
+
field, format: value => value && typeof value === 'object' ? JSON.stringify(value, null, 2) : '{}',
|
|
26
|
+
parse: text => {
|
|
27
|
+
if (!text.trim()) return { kind: 'clear' }
|
|
28
|
+
try { return { kind: 'set', value: validateModelParameters(JSON.parse(text), kind) } } catch { return undefined }
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const specs: SettingsFieldSpec[] = [
|
|
33
|
+
...['apiKey', 'baseUrl', 'embeddingModel', 'rerankModel'].map(settingsTextField),
|
|
34
|
+
numberField('embeddingDimensions', 1, 4096), numberField('candidateCount', 1, 100), numberField('recallCount', 1, 100),
|
|
35
|
+
numberField('compressionRounds', 2, 1000000), numberField('retainRounds', 1, 1000000),
|
|
36
|
+
parametersField('embeddingParameters', 'embedding'), parametersField('rerankParameters', 'rerank'),
|
|
37
|
+
{ field: 'autoRecall', format: value => String(value ?? true), parse: text => text === 'true' || text === 'false' ? { kind: 'set', value: text === 'true' } : undefined },
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
/** Native staged form: only edited paths are sent, preserving undisclosed secrets. */
|
|
41
|
+
export class DiarySettingsController {
|
|
42
|
+
readonly form: SettingsFormModel<FormValues>
|
|
43
|
+
readonly store: SnapshotStore<DiarySettingsState>
|
|
44
|
+
|
|
45
|
+
constructor(private readonly scope: SettingsFormScope<FormValues>, private readonly keyConfigured: () => boolean = () => false) {
|
|
46
|
+
this.form = new SettingsFormModel(scope, specs)
|
|
47
|
+
this.store = this.form.bind(() => this.projection())
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private projection(): DiarySettingsState {
|
|
51
|
+
const fields = Object.fromEntries(editableFields.map(field => [field, this.form.field(field)])) as DiarySettingsState['fields']
|
|
52
|
+
const base = this.scope.getSnapshot().base as FormValues | undefined
|
|
53
|
+
const number = (field: 'compressionRounds' | 'retainRounds' | 'recallCount' | 'candidateCount', fallback: number) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback
|
|
54
|
+
let error: string | null = null
|
|
55
|
+
if (number('compressionRounds', 20) <= number('retainRounds', 2)) error = '压缩轮次必须大于保留轮次。'
|
|
56
|
+
if (number('recallCount', 6) > number('candidateCount', 30)) error = '召回条数不能大于候选数量。'
|
|
57
|
+
for (const kind of ['embedding', 'rerank'] as const) {
|
|
58
|
+
const text = fields[`${kind}Parameters`].text.trim()
|
|
59
|
+
try { validateModelParameters(JSON.parse(text || '{}'), kind) }
|
|
60
|
+
catch (failure) { error = failure instanceof SyntaxError ? `${kind} 参数需要合法的 JSON 对象。` : (failure as Error).message }
|
|
61
|
+
}
|
|
62
|
+
const endpoint = fields.baseUrl.text.trim()
|
|
63
|
+
try {
|
|
64
|
+
if (endpoint) {
|
|
65
|
+
const url = new URL(endpoint)
|
|
66
|
+
if (url.username || url.password || url.search || url.hash || url.pathname !== '/' || url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname))) throw new Error()
|
|
67
|
+
}
|
|
68
|
+
} catch { fields.baseUrl.invalid = true; error = '百炼端点需要 HTTPS origin,例如 https://dashscope.aliyuncs.com。' }
|
|
69
|
+
for (const field of ['embeddingModel', 'rerankModel'] as const) {
|
|
70
|
+
if (fields[field].text.trim().length > 200) { fields[field].invalid = true; error = '模型名不能超过 200 字符。' }
|
|
71
|
+
}
|
|
72
|
+
const shell = this.form.shell()
|
|
73
|
+
return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async save(): Promise<void> { if (!this.projection().invalid) await this.form.save() }
|
|
77
|
+
inject() {
|
|
78
|
+
return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => { void this.save() } }
|
|
79
|
+
}
|
|
80
|
+
dispose(): void { this.form.dispose() }
|
|
81
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Context } from '@deepseek-ai/cordis'
|
|
2
|
+
import type {} from '@deepseek-ai/dsh-client-ui-settings/client'
|
|
3
|
+
import type {} from '@deepseek-ai/dsh-client-ui-renderer/client'
|
|
4
|
+
import { DiarySettingsController } from './controller.js'
|
|
5
|
+
import type { FormValues } from './controller.js'
|
|
6
|
+
import { DiarySettingsPage } from './page.js'
|
|
7
|
+
|
|
8
|
+
export { DiarySettingsController } from './controller.js'
|
|
9
|
+
export { DiarySettingsPage } from './page.js'
|
|
10
|
+
export const inject = ['slots', 'configForms']
|
|
11
|
+
|
|
12
|
+
export function apply(ctx: Context): void {
|
|
13
|
+
const controller = new DiarySettingsController(ctx.configForms.get<FormValues>('diary-memory'), () => {
|
|
14
|
+
const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find(item => item.ns === 'diary-memory')
|
|
15
|
+
return entry?.secrets?.some(item => item.path.length === 1 && item.path[0] === 'apiKey' && item.set) ?? false
|
|
16
|
+
})
|
|
17
|
+
ctx.effect(() => () => controller.dispose(), 'diary-memory: settings form')
|
|
18
|
+
ctx.effect(() => ctx.configForms.whileServed(['diary-memory'], () => ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
19
|
+
name: 'settings.section', id: 'diary-memory', order: 65, label: '陪伴日记', inject: () => controller.inject(),
|
|
20
|
+
}, DiarySettingsPage))), 'diary-memory: settings page')
|
|
21
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { SettingsForm, SettingsSecretField, SettingsValueField, Switch } from '@deepseek-ai/dsh-client-ui-primitives'
|
|
2
|
+
import type { CSSProperties, ReactNode } from 'react'
|
|
3
|
+
import type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'
|
|
4
|
+
import type { DiarySettingsController, EditableField } from './controller.js'
|
|
5
|
+
|
|
6
|
+
type PageProps = InjectFace<ReturnType<DiarySettingsController['inject']>>
|
|
7
|
+
const card: CSSProperties = { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 14, padding: '16px 20px', marginTop: 16, minWidth: 0 }
|
|
8
|
+
const hint: CSSProperties = { fontSize: 12, lineHeight: 1.6, color: 'var(--dsw-alias-label-tertiary)', margin: '8px 0 0' }
|
|
9
|
+
const textarea: CSSProperties = { display: 'block', width: '100%', boxSizing: 'border-box', minHeight: 110, padding: 12, borderRadius: 8, border: '1px solid var(--dsw-alias-border-l2)', background: 'var(--dsw-alias-bg-layer-3)', color: 'var(--dsw-alias-label-primary)', fontFamily: 'var(--dsw-font-mono, monospace)', fontSize: 12, lineHeight: 1.6, resize: 'vertical' }
|
|
10
|
+
|
|
11
|
+
function Group({ title, children }: { title: string; children: ReactNode }) {
|
|
12
|
+
return <section aria-label={title} style={card}><h3 style={{ fontSize: 14, margin: '0 0 8px' }}>{title}</h3>{children}</section>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function DiarySettingsPage(props: PageProps) {
|
|
16
|
+
const state = props.useDiarySettings(value => value)
|
|
17
|
+
const disabled = !state.writable || state.saving
|
|
18
|
+
const valueField = (field: EditableField, label: string, description: string, numeric = false) => <SettingsValueField
|
|
19
|
+
key={field} id={`diary-${field}`} label={label} hint={description} numeric={numeric}
|
|
20
|
+
{...state.fields[field]} disabled={disabled} overriddenLabel="已自定义" resetLabel="恢复默认"
|
|
21
|
+
invalidLabel={numeric ? '请填写范围内的整数。' : '请检查填写的内容。'}
|
|
22
|
+
onEdit={text => props.edit(field, text)} onReset={() => props.resetField(field)}
|
|
23
|
+
/>
|
|
24
|
+
const parameters = (field: 'embeddingParameters' | 'rerankParameters', description: string) => <div style={{ padding: '12px 0' }}>
|
|
25
|
+
<label htmlFor={`diary-${field}`} style={{ display: 'block', fontSize: 13, fontWeight: 500, marginBottom: 8 }}>额外参数(JSON)</label>
|
|
26
|
+
<textarea id={`diary-${field}`} aria-describedby={`diary-${field}-hint`} aria-invalid={state.fields[field].invalid || undefined}
|
|
27
|
+
value={state.fields[field].text} onChange={event => props.edit(field, event.target.value)} disabled={disabled}
|
|
28
|
+
spellCheck={false} rows={5} style={textarea} />
|
|
29
|
+
<p id={`diary-${field}-hint`} style={hint}>{description}</p>
|
|
30
|
+
</div>
|
|
31
|
+
return <div data-diary-settings style={{ color: 'var(--dsw-alias-label-primary)', paddingBottom: 16 }}>
|
|
32
|
+
<h2 style={{ fontSize: 18, margin: '0 0 8px' }}>陪伴日记</h2>
|
|
33
|
+
<p style={hint}>设置百炼连接、回忆模型与日记压缩方式。填写后点击保存。</p>
|
|
34
|
+
<SettingsForm state={state} onSave={props.save} onDiscard={props.discard} labels={{
|
|
35
|
+
unavailable: '正在加载配置;若持续不可用,请检查陪伴日记插件是否已启用。', readOnly: '当前配置只读。',
|
|
36
|
+
saveFailed: '保存失败或配置已在其他窗口修改。输入已保留,请检查后重试。', save: '保存配置', saving: '正在保存…',
|
|
37
|
+
}}>
|
|
38
|
+
<Group title="百炼连接">
|
|
39
|
+
<SettingsSecretField id="diary-apiKey" label="百炼 API Key" hint="密钥不会回显;留空保留已保存的 Key。也可通过 DSH 的环境变量提供。"
|
|
40
|
+
text={state.fields.apiKey.text} configured={state.keyConfigured} stateLabel={state.keyConfigured ? '已保存(不回显)' : '尚未保存'}
|
|
41
|
+
disabled={disabled} onEdit={text => props.edit('apiKey', text)} />
|
|
42
|
+
{valueField('baseUrl', '百炼 API 地址', '需要与 API Key 的地域一致,例如 https://dashscope.aliyuncs.com。')}
|
|
43
|
+
</Group>
|
|
44
|
+
<Group title="Embedding · 向量召回">
|
|
45
|
+
{valueField('embeddingModel', 'Embedding 模型名', '可手动填写百炼支持的文本向量模型,例如 text-embedding-v4。')}
|
|
46
|
+
{valueField('embeddingDimensions', '向量维度', '1–4096;请填写所选模型支持的维度。', true)}
|
|
47
|
+
{parameters('embeddingParameters', '填写该模型支持的 parameters,例如 {"output_type":"dense"}。dimension 在上方填写,text_type 由入库与召回自动设置。')}
|
|
48
|
+
<p style={hint}>更改 Embedding 模型、维度或参数后,旧向量不会参与新配置的检索。</p>
|
|
49
|
+
</Group>
|
|
50
|
+
<Group title="Rerank · 回忆排序">
|
|
51
|
+
{valueField('rerankModel', 'Rerank 模型名', '可手动填写百炼支持的重排模型,例如 gte-rerank-v2。')}
|
|
52
|
+
{valueField('candidateCount', '候选数量', '1–100;先由向量检索选出这些日记交给 Rerank。', true)}
|
|
53
|
+
{valueField('recallCount', '召回条数(top_n)', '1–100,且不大于候选数量。', true)}
|
|
54
|
+
{parameters('rerankParameters', '填写该模型支持的 parameters,例如 {"return_documents":false}。top_n 由上方的召回条数设置。')}
|
|
55
|
+
</Group>
|
|
56
|
+
<Group title="日记与陪伴">
|
|
57
|
+
{valueField('compressionRounds', '触发压缩的轮次', '完成多少轮后保存日记并安全压缩;须大于保留轮次。', true)}
|
|
58
|
+
{valueField('retainRounds', '保留最近轮次', '至少保留最近多少个用户输入及后续消息。', true)}
|
|
59
|
+
<div style={{ display: 'flex', gap: 10, justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13 }}>
|
|
60
|
+
<span>自动回想相关日记</span>
|
|
61
|
+
<Switch label="自动回想相关日记" checked={state.fields.autoRecall.text === 'true'} disabled={disabled}
|
|
62
|
+
onChange={value => props.edit('autoRecall', String(value))} />
|
|
63
|
+
</div>
|
|
64
|
+
</Group>
|
|
65
|
+
{state.error ? <p role="alert" style={{ ...hint, color: 'var(--dsw-alias-label-error)' }}>{state.error}</p> : null}
|
|
66
|
+
</SettingsForm>
|
|
67
|
+
</div>
|
|
68
|
+
}
|