dsh-diary-memory 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +193 -2
- package/cordis.patch.yml +39 -0
- package/icon.svg +1 -0
- package/lib/bailian-client.d.ts +38 -0
- package/lib/bailian-client.js +125 -0
- package/lib/bailian-client.js.map +1 -0
- 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 +104 -0
- package/lib/config.js +113 -0
- package/lib/config.js.map +1 -0
- package/lib/diary.d.ts +72 -0
- package/lib/diary.js +157 -0
- package/lib/diary.js.map +1 -0
- package/lib/index.d.ts +13 -0
- package/lib/index.js +17 -0
- package/lib/index.js.map +1 -0
- package/lib/memory-store.d.ts +60 -0
- package/lib/memory-store.js +143 -0
- package/lib/memory-store.js.map +1 -0
- 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.d.ts +23 -0
- package/lib/orchestrator.js +118 -0
- package/lib/orchestrator.js.map +1 -0
- package/lib/projection.d.ts +15 -0
- package/lib/projection.js +23 -0
- package/lib/projection.js.map +1 -0
- package/lib/retrieval-service.d.ts +64 -0
- package/lib/retrieval-service.js +135 -0
- package/lib/retrieval-service.js.map +1 -0
- package/lib/tools.d.ts +5 -0
- package/lib/tools.js +18 -0
- package/lib/tools.js.map +1 -0
- package/locale/compaction/en.json +1 -0
- package/locale/compaction/zh.json +1 -0
- package/locale/en.json +1 -0
- package/locale/tools/en.json +1 -0
- package/locale/tools/zh.json +1 -0
- package/locale/zh.json +1 -0
- package/package.json +168 -4
- package/src/bailian-client.ts +125 -0
- 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 +138 -0
- package/src/diary.ts +170 -0
- package/src/index.ts +25 -0
- package/src/memory-store.ts +184 -0
- package/src/model-parameters.ts +32 -0
- package/src/orchestrator.ts +121 -0
- package/src/projection.ts +30 -0
- package/src/retrieval-service.ts +149 -0
- package/src/tools.ts +21 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { SettingsForm, SettingsSecretField, SettingsValueField, Switch } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
const card = { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 14, padding: '16px 20px', marginTop: 16, minWidth: 0 };
|
|
4
|
+
const hint = { fontSize: 12, lineHeight: 1.6, color: 'var(--dsw-alias-label-tertiary)', margin: '8px 0 0' };
|
|
5
|
+
const textarea = { 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' };
|
|
6
|
+
function Group({ title, children }) {
|
|
7
|
+
return _jsxs("section", { "aria-label": title, style: card, children: [_jsx("h3", { style: { fontSize: 14, margin: '0 0 8px' }, children: title }), children] });
|
|
8
|
+
}
|
|
9
|
+
export function DiarySettingsPage(props) {
|
|
10
|
+
const state = props.useDiarySettings(value => value);
|
|
11
|
+
const disabled = !state.writable || state.saving;
|
|
12
|
+
const valueField = (field, label, description, numeric = false) => _jsx(SettingsValueField, { id: `diary-${field}`, label: label, hint: description, numeric: numeric, ...state.fields[field], disabled: disabled, overriddenLabel: "\u5DF2\u81EA\u5B9A\u4E49", resetLabel: "\u6062\u590D\u9ED8\u8BA4", invalidLabel: numeric ? '请填写范围内的整数。' : '请检查填写的内容。', onEdit: text => props.edit(field, text), onReset: () => props.resetField(field) }, field);
|
|
13
|
+
const parameters = (field, description) => _jsxs("div", { style: { padding: '12px 0' }, children: [_jsx("label", { htmlFor: `diary-${field}`, style: { display: 'block', fontSize: 13, fontWeight: 500, marginBottom: 8 }, children: "\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09" }), _jsx("textarea", { id: `diary-${field}`, "aria-describedby": `diary-${field}-hint`, "aria-invalid": state.fields[field].invalid || undefined, value: state.fields[field].text, onChange: event => props.edit(field, event.target.value), disabled: disabled, spellCheck: false, rows: 5, style: textarea }), _jsx("p", { id: `diary-${field}-hint`, style: hint, children: description })] });
|
|
14
|
+
return _jsxs("div", { "data-diary-settings": true, style: { color: 'var(--dsw-alias-label-primary)', paddingBottom: 16 }, children: [_jsx("h2", { style: { fontSize: 18, margin: '0 0 8px' }, children: "\u966A\u4F34\u65E5\u8BB0" }), _jsx("p", { style: hint, children: "\u8BBE\u7F6E\u767E\u70BC\u8FDE\u63A5\u3001\u56DE\u5FC6\u6A21\u578B\u4E0E\u65E5\u8BB0\u538B\u7F29\u65B9\u5F0F\u3002\u586B\u5199\u540E\u70B9\u51FB\u4FDD\u5B58\u3002" }), _jsxs(SettingsForm, { state: state, onSave: props.save, onDiscard: props.discard, labels: {
|
|
15
|
+
unavailable: '正在加载配置;若持续不可用,请检查陪伴日记插件是否已启用。', readOnly: '当前配置只读。',
|
|
16
|
+
saveFailed: '保存失败或配置已在其他窗口修改。输入已保留,请检查后重试。', save: '保存配置', saving: '正在保存…',
|
|
17
|
+
}, children: [_jsxs(Group, { title: "\u767E\u70BC\u8FDE\u63A5", children: [_jsx(SettingsSecretField, { id: "diary-apiKey", label: "\u767E\u70BC API Key", hint: "\u5BC6\u94A5\u4E0D\u4F1A\u56DE\u663E\uFF1B\u7559\u7A7A\u4FDD\u7559\u5DF2\u4FDD\u5B58\u7684 Key\u3002\u4E5F\u53EF\u901A\u8FC7 DSH \u7684\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\u3002", text: state.fields.apiKey.text, configured: state.keyConfigured, stateLabel: state.keyConfigured ? '已保存(不回显)' : '尚未保存', disabled: disabled, onEdit: text => props.edit('apiKey', text) }), valueField('baseUrl', '百炼 API 地址', '需要与 API Key 的地域一致,例如 https://dashscope.aliyuncs.com。')] }), _jsxs(Group, { title: "Embedding \u00B7 \u5411\u91CF\u53EC\u56DE", children: [valueField('embeddingModel', 'Embedding 模型名', '可手动填写百炼支持的文本向量模型,例如 text-embedding-v4。'), valueField('embeddingDimensions', '向量维度', '1–4096;请填写所选模型支持的维度。', true), parameters('embeddingParameters', '填写该模型支持的 parameters,例如 {"output_type":"dense"}。dimension 在上方填写,text_type 由入库与召回自动设置。'), _jsx("p", { style: hint, children: "\u66F4\u6539 Embedding \u6A21\u578B\u3001\u7EF4\u5EA6\u6216\u53C2\u6570\u540E\uFF0C\u65E7\u5411\u91CF\u4E0D\u4F1A\u53C2\u4E0E\u65B0\u914D\u7F6E\u7684\u68C0\u7D22\u3002" })] }), _jsxs(Group, { title: "Rerank \u00B7 \u56DE\u5FC6\u6392\u5E8F", children: [valueField('rerankModel', 'Rerank 模型名', '可手动填写百炼支持的重排模型,例如 gte-rerank-v2。'), valueField('candidateCount', '候选数量', '1–100;先由向量检索选出这些日记交给 Rerank。', true), valueField('recallCount', '召回条数(top_n)', '1–100,且不大于候选数量。', true), parameters('rerankParameters', '填写该模型支持的 parameters,例如 {"return_documents":false}。top_n 由上方的召回条数设置。')] }), _jsxs(Group, { title: "\u65E5\u8BB0\u4E0E\u966A\u4F34", children: [valueField('compressionRounds', '触发压缩的轮次', '完成多少轮后保存日记并安全压缩;须大于保留轮次。', true), valueField('retainRounds', '保留最近轮次', '至少保留最近多少个用户输入及后续消息。', true), _jsxs("div", { style: { display: 'flex', gap: 10, justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13 }, children: [_jsx("span", { children: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0" }), _jsx(Switch, { label: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0", checked: state.fields.autoRecall.text === 'true', disabled: disabled, onChange: value => props.edit('autoRecall', String(value)) })] })] }), state.error ? _jsx("p", { role: "alert", style: { ...hint, color: 'var(--dsw-alias-label-error)' }, children: state.error }) : null] })] });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/client/page.tsx"],"names":[],"mappings":"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"}
|
package/lib/client.js
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({ id: "dsh-diary-memory", factory: (require) => { var module = { exports: {} }; var exports = module.exports;
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/client/index.ts
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
DiarySettingsController: () => DiarySettingsController,
|
|
25
|
+
DiarySettingsPage: () => DiarySettingsPage,
|
|
26
|
+
apply: () => apply,
|
|
27
|
+
inject: () => inject
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
|
+
|
|
31
|
+
// src/client/controller.ts
|
|
32
|
+
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
33
|
+
|
|
34
|
+
// src/model-parameters.ts
|
|
35
|
+
function validateModelParameters(value, kind) {
|
|
36
|
+
if (!value || typeof value !== "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) throw new Error(`${kind} \u53C2\u6570\u5FC5\u987B\u4E3A JSON \u5BF9\u8C61`);
|
|
37
|
+
const visit = (item, depth = 0) => {
|
|
38
|
+
if (depth > 16) throw new Error(`${kind} \u53C2\u6570\u5D4C\u5957\u8FC7\u6DF1`);
|
|
39
|
+
if (item === null || typeof item === "boolean" || typeof item === "string") return item;
|
|
40
|
+
if (typeof item === "number" && Number.isFinite(item)) return item;
|
|
41
|
+
if (Array.isArray(item)) return Object.freeze(item.map((child) => visit(child, depth + 1)));
|
|
42
|
+
if (item && typeof item === "object" && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {
|
|
43
|
+
return Object.freeze(Object.fromEntries(Object.entries(item).map(([key, child]) => [key, visit(child, depth + 1)])));
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`${kind} \u53C2\u6570\u53EA\u80FD\u5305\u542B JSON \u503C`);
|
|
46
|
+
};
|
|
47
|
+
const parameters = visit(value);
|
|
48
|
+
if (JSON.stringify(parameters).length > 16e3) throw new Error(`${kind} \u53C2\u6570\u4E0D\u80FD\u8D85\u8FC7 16000 \u5B57\u7B26`);
|
|
49
|
+
const reserved = kind === "embedding" ? ["dimension", "text_type"] : ["top_n"];
|
|
50
|
+
if (reserved.some((key) => Object.hasOwn(parameters, key))) throw new Error(kind === "embedding" ? "dimension \u8BF7\u5728\u5411\u91CF\u7EF4\u5EA6\u4E2D\u586B\u5199\uFF1Btext_type \u7531\u5165\u5E93\u548C\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E" : "top_n \u8BF7\u5728\u53EC\u56DE\u6761\u6570\u4E2D\u586B\u5199");
|
|
51
|
+
if (kind === "embedding" && parameters.output_type !== void 0 && parameters.output_type !== "dense") throw new Error("\u672C\u5730\u5411\u91CF\u68C0\u7D22\u9700\u8981 dense \u5411\u91CF\uFF0Coutput_type \u4EC5\u652F\u6301 dense");
|
|
52
|
+
if (kind === "rerank" && parameters.return_documents !== void 0 && typeof parameters.return_documents !== "boolean") throw new Error("return_documents \u5FC5\u987B\u662F\u5E03\u5C14\u503C");
|
|
53
|
+
return parameters;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/client/controller.ts
|
|
57
|
+
var editableFields = ["apiKey", "baseUrl", "embeddingModel", "embeddingDimensions", "embeddingParameters", "rerankModel", "rerankParameters", "candidateCount", "recallCount", "compressionRounds", "retainRounds", "autoRecall"];
|
|
58
|
+
function numberField(field, min, max) {
|
|
59
|
+
return {
|
|
60
|
+
field,
|
|
61
|
+
format: (value) => typeof value === "number" ? String(value) : "",
|
|
62
|
+
parse: (text) => !text.trim() ? { kind: "clear" } : Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: "set", value: Number(text) } : void 0
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function parametersField(field, kind) {
|
|
66
|
+
return {
|
|
67
|
+
field,
|
|
68
|
+
format: (value) => value && typeof value === "object" ? JSON.stringify(value, null, 2) : "{}",
|
|
69
|
+
parse: (text) => {
|
|
70
|
+
if (!text.trim()) return { kind: "clear" };
|
|
71
|
+
try {
|
|
72
|
+
return { kind: "set", value: validateModelParameters(JSON.parse(text), kind) };
|
|
73
|
+
} catch {
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
var specs = [
|
|
80
|
+
...["apiKey", "baseUrl", "embeddingModel", "rerankModel"].map(import_dsh_client_ui_primitives.settingsTextField),
|
|
81
|
+
numberField("embeddingDimensions", 1, 4096),
|
|
82
|
+
numberField("candidateCount", 1, 100),
|
|
83
|
+
numberField("recallCount", 1, 100),
|
|
84
|
+
numberField("compressionRounds", 2, 1e6),
|
|
85
|
+
numberField("retainRounds", 1, 1e6),
|
|
86
|
+
parametersField("embeddingParameters", "embedding"),
|
|
87
|
+
parametersField("rerankParameters", "rerank"),
|
|
88
|
+
{ field: "autoRecall", format: (value) => String(value ?? true), parse: (text) => text === "true" || text === "false" ? { kind: "set", value: text === "true" } : void 0 }
|
|
89
|
+
];
|
|
90
|
+
var DiarySettingsController = class {
|
|
91
|
+
constructor(scope, keyConfigured = () => false) {
|
|
92
|
+
this.scope = scope;
|
|
93
|
+
this.keyConfigured = keyConfigured;
|
|
94
|
+
this.form = new import_dsh_client_ui_primitives.SettingsFormModel(scope, specs);
|
|
95
|
+
this.store = this.form.bind(() => this.projection());
|
|
96
|
+
}
|
|
97
|
+
scope;
|
|
98
|
+
keyConfigured;
|
|
99
|
+
form;
|
|
100
|
+
store;
|
|
101
|
+
projection() {
|
|
102
|
+
const fields = Object.fromEntries(editableFields.map((field) => [field, this.form.field(field)]));
|
|
103
|
+
const base = this.scope.getSnapshot().base;
|
|
104
|
+
const number = (field, fallback) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback;
|
|
105
|
+
let error = null;
|
|
106
|
+
if (number("compressionRounds", 20) <= number("retainRounds", 2)) error = "\u538B\u7F29\u8F6E\u6B21\u5FC5\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002";
|
|
107
|
+
if (number("recallCount", 6) > number("candidateCount", 30)) error = "\u53EC\u56DE\u6761\u6570\u4E0D\u80FD\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002";
|
|
108
|
+
for (const kind of ["embedding", "rerank"]) {
|
|
109
|
+
const text = fields[`${kind}Parameters`].text.trim();
|
|
110
|
+
try {
|
|
111
|
+
validateModelParameters(JSON.parse(text || "{}"), kind);
|
|
112
|
+
} catch (failure) {
|
|
113
|
+
error = failure instanceof SyntaxError ? `${kind} \u53C2\u6570\u9700\u8981\u5408\u6CD5\u7684 JSON \u5BF9\u8C61\u3002` : failure.message;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const endpoint = fields.baseUrl.text.trim();
|
|
117
|
+
try {
|
|
118
|
+
if (endpoint) {
|
|
119
|
+
const url = new URL(endpoint);
|
|
120
|
+
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();
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
fields.baseUrl.invalid = true;
|
|
124
|
+
error = "\u767E\u70BC\u7AEF\u70B9\u9700\u8981 HTTPS origin\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002";
|
|
125
|
+
}
|
|
126
|
+
for (const field of ["embeddingModel", "rerankModel"]) {
|
|
127
|
+
if (fields[field].text.trim().length > 200) {
|
|
128
|
+
fields[field].invalid = true;
|
|
129
|
+
error = "\u6A21\u578B\u540D\u4E0D\u80FD\u8D85\u8FC7 200 \u5B57\u7B26\u3002";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const shell = this.form.shell();
|
|
133
|
+
return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error };
|
|
134
|
+
}
|
|
135
|
+
async save() {
|
|
136
|
+
if (!this.projection().invalid) await this.form.save();
|
|
137
|
+
}
|
|
138
|
+
inject() {
|
|
139
|
+
return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => {
|
|
140
|
+
void this.save();
|
|
141
|
+
} };
|
|
142
|
+
}
|
|
143
|
+
dispose() {
|
|
144
|
+
this.form.dispose();
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// src/client/page.tsx
|
|
149
|
+
var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
150
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
151
|
+
var card = { border: "1px solid var(--dsw-alias-border-l2)", borderRadius: 14, padding: "16px 20px", marginTop: 16, minWidth: 0 };
|
|
152
|
+
var hint = { fontSize: 12, lineHeight: 1.6, color: "var(--dsw-alias-label-tertiary)", margin: "8px 0 0" };
|
|
153
|
+
var textarea = { 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" };
|
|
154
|
+
function Group({ title, children }) {
|
|
155
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { "aria-label": title, style: card, children: [
|
|
156
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { style: { fontSize: 14, margin: "0 0 8px" }, children: title }),
|
|
157
|
+
children
|
|
158
|
+
] });
|
|
159
|
+
}
|
|
160
|
+
function DiarySettingsPage(props) {
|
|
161
|
+
const state = props.useDiarySettings((value) => value);
|
|
162
|
+
const disabled = !state.writable || state.saving;
|
|
163
|
+
const valueField = (field, label, description, numeric = false) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
164
|
+
import_dsh_client_ui_primitives2.SettingsValueField,
|
|
165
|
+
{
|
|
166
|
+
id: `diary-${field}`,
|
|
167
|
+
label,
|
|
168
|
+
hint: description,
|
|
169
|
+
numeric,
|
|
170
|
+
...state.fields[field],
|
|
171
|
+
disabled,
|
|
172
|
+
overriddenLabel: "\u5DF2\u81EA\u5B9A\u4E49",
|
|
173
|
+
resetLabel: "\u6062\u590D\u9ED8\u8BA4",
|
|
174
|
+
invalidLabel: numeric ? "\u8BF7\u586B\u5199\u8303\u56F4\u5185\u7684\u6574\u6570\u3002" : "\u8BF7\u68C0\u67E5\u586B\u5199\u7684\u5185\u5BB9\u3002",
|
|
175
|
+
onEdit: (text) => props.edit(field, text),
|
|
176
|
+
onReset: () => props.resetField(field)
|
|
177
|
+
},
|
|
178
|
+
field
|
|
179
|
+
);
|
|
180
|
+
const parameters = (field, description) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: "12px 0" }, children: [
|
|
181
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { htmlFor: `diary-${field}`, style: { display: "block", fontSize: 13, fontWeight: 500, marginBottom: 8 }, children: "\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09" }),
|
|
182
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
183
|
+
"textarea",
|
|
184
|
+
{
|
|
185
|
+
id: `diary-${field}`,
|
|
186
|
+
"aria-describedby": `diary-${field}-hint`,
|
|
187
|
+
"aria-invalid": state.fields[field].invalid || void 0,
|
|
188
|
+
value: state.fields[field].text,
|
|
189
|
+
onChange: (event) => props.edit(field, event.target.value),
|
|
190
|
+
disabled,
|
|
191
|
+
spellCheck: false,
|
|
192
|
+
rows: 5,
|
|
193
|
+
style: textarea
|
|
194
|
+
}
|
|
195
|
+
),
|
|
196
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { id: `diary-${field}-hint`, style: hint, children: description })
|
|
197
|
+
] });
|
|
198
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { "data-diary-settings": true, style: { color: "var(--dsw-alias-label-primary)", paddingBottom: 16 }, children: [
|
|
199
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { style: { fontSize: 18, margin: "0 0 8px" }, children: "\u966A\u4F34\u65E5\u8BB0" }),
|
|
200
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: hint, children: "\u8BBE\u7F6E\u767E\u70BC\u8FDE\u63A5\u3001\u56DE\u5FC6\u6A21\u578B\u4E0E\u65E5\u8BB0\u538B\u7F29\u65B9\u5F0F\u3002\u586B\u5199\u540E\u70B9\u51FB\u4FDD\u5B58\u3002" }),
|
|
201
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dsh_client_ui_primitives2.SettingsForm, { state, onSave: props.save, onDiscard: props.discard, labels: {
|
|
202
|
+
unavailable: "\u6B63\u5728\u52A0\u8F7D\u914D\u7F6E\uFF1B\u82E5\u6301\u7EED\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u966A\u4F34\u65E5\u8BB0\u63D2\u4EF6\u662F\u5426\u5DF2\u542F\u7528\u3002",
|
|
203
|
+
readOnly: "\u5F53\u524D\u914D\u7F6E\u53EA\u8BFB\u3002",
|
|
204
|
+
saveFailed: "\u4FDD\u5B58\u5931\u8D25\u6216\u914D\u7F6E\u5DF2\u5728\u5176\u4ED6\u7A97\u53E3\u4FEE\u6539\u3002\u8F93\u5165\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002",
|
|
205
|
+
save: "\u4FDD\u5B58\u914D\u7F6E",
|
|
206
|
+
saving: "\u6B63\u5728\u4FDD\u5B58\u2026"
|
|
207
|
+
}, children: [
|
|
208
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "\u767E\u70BC\u8FDE\u63A5", children: [
|
|
209
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
210
|
+
import_dsh_client_ui_primitives2.SettingsSecretField,
|
|
211
|
+
{
|
|
212
|
+
id: "diary-apiKey",
|
|
213
|
+
label: "\u767E\u70BC API Key",
|
|
214
|
+
hint: "\u5BC6\u94A5\u4E0D\u4F1A\u56DE\u663E\uFF1B\u7559\u7A7A\u4FDD\u7559\u5DF2\u4FDD\u5B58\u7684 Key\u3002\u4E5F\u53EF\u901A\u8FC7 DSH \u7684\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\u3002",
|
|
215
|
+
text: state.fields.apiKey.text,
|
|
216
|
+
configured: state.keyConfigured,
|
|
217
|
+
stateLabel: state.keyConfigured ? "\u5DF2\u4FDD\u5B58\uFF08\u4E0D\u56DE\u663E\uFF09" : "\u5C1A\u672A\u4FDD\u5B58",
|
|
218
|
+
disabled,
|
|
219
|
+
onEdit: (text) => props.edit("apiKey", text)
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
valueField("baseUrl", "\u767E\u70BC API \u5730\u5740", "\u9700\u8981\u4E0E API Key \u7684\u5730\u57DF\u4E00\u81F4\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002")
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "Embedding \xB7 \u5411\u91CF\u53EC\u56DE", children: [
|
|
225
|
+
valueField("embeddingModel", "Embedding \u6A21\u578B\u540D", "\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u6587\u672C\u5411\u91CF\u6A21\u578B\uFF0C\u4F8B\u5982 text-embedding-v4\u3002"),
|
|
226
|
+
valueField("embeddingDimensions", "\u5411\u91CF\u7EF4\u5EA6", "1\u20134096\uFF1B\u8BF7\u586B\u5199\u6240\u9009\u6A21\u578B\u652F\u6301\u7684\u7EF4\u5EA6\u3002", true),
|
|
227
|
+
parameters("embeddingParameters", '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {"output_type":"dense"}\u3002dimension \u5728\u4E0A\u65B9\u586B\u5199\uFF0Ctext_type \u7531\u5165\u5E93\u4E0E\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E\u3002'),
|
|
228
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: hint, children: "\u66F4\u6539 Embedding \u6A21\u578B\u3001\u7EF4\u5EA6\u6216\u53C2\u6570\u540E\uFF0C\u65E7\u5411\u91CF\u4E0D\u4F1A\u53C2\u4E0E\u65B0\u914D\u7F6E\u7684\u68C0\u7D22\u3002" })
|
|
229
|
+
] }),
|
|
230
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "Rerank \xB7 \u56DE\u5FC6\u6392\u5E8F", children: [
|
|
231
|
+
valueField("rerankModel", "Rerank \u6A21\u578B\u540D", "\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u91CD\u6392\u6A21\u578B\uFF0C\u4F8B\u5982 gte-rerank-v2\u3002"),
|
|
232
|
+
valueField("candidateCount", "\u5019\u9009\u6570\u91CF", "1\u2013100\uFF1B\u5148\u7531\u5411\u91CF\u68C0\u7D22\u9009\u51FA\u8FD9\u4E9B\u65E5\u8BB0\u4EA4\u7ED9 Rerank\u3002", true),
|
|
233
|
+
valueField("recallCount", "\u53EC\u56DE\u6761\u6570\uFF08top_n\uFF09", "1\u2013100\uFF0C\u4E14\u4E0D\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002", true),
|
|
234
|
+
parameters("rerankParameters", '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {"return_documents":false}\u3002top_n \u7531\u4E0A\u65B9\u7684\u53EC\u56DE\u6761\u6570\u8BBE\u7F6E\u3002')
|
|
235
|
+
] }),
|
|
236
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Group, { title: "\u65E5\u8BB0\u4E0E\u966A\u4F34", children: [
|
|
237
|
+
valueField("compressionRounds", "\u89E6\u53D1\u538B\u7F29\u7684\u8F6E\u6B21", "\u5B8C\u6210\u591A\u5C11\u8F6E\u540E\u4FDD\u5B58\u65E5\u8BB0\u5E76\u5B89\u5168\u538B\u7F29\uFF1B\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002", true),
|
|
238
|
+
valueField("retainRounds", "\u4FDD\u7559\u6700\u8FD1\u8F6E\u6B21", "\u81F3\u5C11\u4FDD\u7559\u6700\u8FD1\u591A\u5C11\u4E2A\u7528\u6237\u8F93\u5165\u53CA\u540E\u7EED\u6D88\u606F\u3002", true),
|
|
239
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { display: "flex", gap: 10, justifyContent: "space-between", alignItems: "center", padding: "12px 0", fontSize: 13 }, children: [
|
|
240
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0" }),
|
|
241
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
242
|
+
import_dsh_client_ui_primitives2.Switch,
|
|
243
|
+
{
|
|
244
|
+
label: "\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0",
|
|
245
|
+
checked: state.fields.autoRecall.text === "true",
|
|
246
|
+
disabled,
|
|
247
|
+
onChange: (value) => props.edit("autoRecall", String(value))
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
] })
|
|
251
|
+
] }),
|
|
252
|
+
state.error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "alert", style: { ...hint, color: "var(--dsw-alias-label-error)" }, children: state.error }) : null
|
|
253
|
+
] })
|
|
254
|
+
] });
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// src/client/index.ts
|
|
258
|
+
var inject = ["slots", "configForms"];
|
|
259
|
+
function apply(ctx) {
|
|
260
|
+
const controller = new DiarySettingsController(ctx.configForms.get("diary-memory"), () => {
|
|
261
|
+
const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find((item) => item.ns === "diary-memory");
|
|
262
|
+
return entry?.secrets?.some((item) => item.path.length === 1 && item.path[0] === "apiKey" && item.set) ?? false;
|
|
263
|
+
});
|
|
264
|
+
ctx.effect(() => () => controller.dispose(), "diary-memory: settings form");
|
|
265
|
+
ctx.effect(() => ctx.configForms.whileServed(["diary-memory"], () => ctx.slots.inject("settings.section", () => ctx.slots.register({
|
|
266
|
+
name: "settings.section",
|
|
267
|
+
id: "diary-memory",
|
|
268
|
+
order: 65,
|
|
269
|
+
label: "\u966A\u4F34\u65E5\u8BB0",
|
|
270
|
+
inject: () => controller.inject()
|
|
271
|
+
}, DiarySettingsPage))), "diary-memory: settings page");
|
|
272
|
+
}
|
|
273
|
+
return module.exports; } });
|
|
274
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/index.ts", "../src/client/controller.ts", "../src/model-parameters.ts", "../src/client/page.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport { DiarySettingsController } from './controller.js'\nimport type { FormValues } from './controller.js'\nimport { DiarySettingsPage } from './page.js'\n\nexport { DiarySettingsController } from './controller.js'\nexport { DiarySettingsPage } from './page.js'\nexport const inject = ['slots', 'configForms']\n\nexport function apply(ctx: Context): void {\n const controller = new DiarySettingsController(ctx.configForms.get<FormValues>('diary-memory'), () => {\n const entry = ctx.configForms.describe().getSnapshot().view?.namespaces.find(item => item.ns === 'diary-memory')\n return entry?.secrets?.some(item => item.path.length === 1 && item.path[0] === 'apiKey' && item.set) ?? false\n })\n ctx.effect(() => () => controller.dispose(), 'diary-memory: settings form')\n ctx.effect(() => ctx.configForms.whileServed(['diary-memory'], () => ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section', id: 'diary-memory', order: 65, label: '\u966A\u4F34\u65E5\u8BB0', inject: () => controller.inject(),\n }, DiarySettingsPage))), 'diary-memory: settings page')\n}\n", "import { SettingsFormModel, settingsTextField } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SettingsFieldSpec, SettingsFieldState, SettingsFormScope, SettingsFormShell } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SnapshotStore } from '@deepseek-ai/dsh-client-store'\nimport type { DiaryConfig } from '../config.js'\nimport { validateModelParameters } from '../model-parameters.js'\n\nexport const editableFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'candidateCount', 'recallCount', 'compressionRounds', 'retainRounds', 'autoRecall'] as const\nexport type EditableField = typeof editableFields[number]\nexport type FormValues = Partial<Pick<DiaryConfig, EditableField>>\nexport interface DiarySettingsState extends SettingsFormShell {\n fields: Record<EditableField, SettingsFieldState>\n keyConfigured: boolean\n error: string | null\n}\n\nfunction numberField(field: string, min: number, max: number): SettingsFieldSpec {\n return {\n field, format: value => typeof value === 'number' ? String(value) : '',\n parse: text => !text.trim() ? { kind: 'clear' }\n : Number.isSafeInteger(Number(text)) && Number(text) >= min && Number(text) <= max ? { kind: 'set', value: Number(text) } : undefined,\n }\n}\nfunction parametersField(field: string, kind: 'embedding' | 'rerank'): SettingsFieldSpec {\n return {\n field, format: value => value && typeof value === 'object' ? JSON.stringify(value, null, 2) : '{}',\n parse: text => {\n if (!text.trim()) return { kind: 'clear' }\n try { return { kind: 'set', value: validateModelParameters(JSON.parse(text), kind) } } catch { return undefined }\n },\n }\n}\nconst specs: SettingsFieldSpec[] = [\n ...['apiKey', 'baseUrl', 'embeddingModel', 'rerankModel'].map(settingsTextField),\n numberField('embeddingDimensions', 1, 4096), numberField('candidateCount', 1, 100), numberField('recallCount', 1, 100),\n numberField('compressionRounds', 2, 1000000), numberField('retainRounds', 1, 1000000),\n parametersField('embeddingParameters', 'embedding'), parametersField('rerankParameters', 'rerank'),\n { field: 'autoRecall', format: value => String(value ?? true), parse: text => text === 'true' || text === 'false' ? { kind: 'set', value: text === 'true' } : undefined },\n]\n\n/** Native staged form: only edited paths are sent, preserving undisclosed secrets. */\nexport class DiarySettingsController {\n readonly form: SettingsFormModel<FormValues>\n readonly store: SnapshotStore<DiarySettingsState>\n\n constructor(private readonly scope: SettingsFormScope<FormValues>, private readonly keyConfigured: () => boolean = () => false) {\n this.form = new SettingsFormModel(scope, specs)\n this.store = this.form.bind(() => this.projection())\n }\n\n private projection(): DiarySettingsState {\n const fields = Object.fromEntries(editableFields.map(field => [field, this.form.field(field)])) as DiarySettingsState['fields']\n const base = this.scope.getSnapshot().base as FormValues | undefined\n const number = (field: 'compressionRounds' | 'retainRounds' | 'recallCount' | 'candidateCount', fallback: number) => fields[field].text.trim() ? Number(fields[field].text) : base?.[field] ?? fallback\n let error: string | null = null\n if (number('compressionRounds', 20) <= number('retainRounds', 2)) error = '\u538B\u7F29\u8F6E\u6B21\u5FC5\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002'\n if (number('recallCount', 6) > number('candidateCount', 30)) error = '\u53EC\u56DE\u6761\u6570\u4E0D\u80FD\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002'\n for (const kind of ['embedding', 'rerank'] as const) {\n const text = fields[`${kind}Parameters`].text.trim()\n try { validateModelParameters(JSON.parse(text || '{}'), kind) }\n catch (failure) { error = failure instanceof SyntaxError ? `${kind} \u53C2\u6570\u9700\u8981\u5408\u6CD5\u7684 JSON \u5BF9\u8C61\u3002` : (failure as Error).message }\n }\n const endpoint = fields.baseUrl.text.trim()\n try {\n if (endpoint) {\n const url = new URL(endpoint)\n 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()\n }\n } catch { fields.baseUrl.invalid = true; error = '\u767E\u70BC\u7AEF\u70B9\u9700\u8981 HTTPS origin\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002' }\n for (const field of ['embeddingModel', 'rerankModel'] as const) {\n if (fields[field].text.trim().length > 200) { fields[field].invalid = true; error = '\u6A21\u578B\u540D\u4E0D\u80FD\u8D85\u8FC7 200 \u5B57\u7B26\u3002' }\n }\n const shell = this.form.shell()\n return { ...shell, invalid: shell.invalid || Boolean(error) || !shell.writable, fields, keyConfigured: this.keyConfigured(), error }\n }\n\n async save(): Promise<void> { if (!this.projection().invalid) await this.form.save() }\n inject() {\n return { hooks: { diarySettings: this.store }, ...this.form.actions(), save: () => { void this.save() } }\n }\n dispose(): void { this.form.dispose() }\n}\n", "export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue }\nexport type ModelParameters = Readonly<Record<string, JsonValue>>\n\n/** Shared by the native configuration reader and the browser parameter editors. */\nexport function validateModelParameters(value: unknown, kind: 'embedding' | 'rerank'): ModelParameters {\n if (!value || typeof value !== 'object' || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) throw new Error(`${kind} \u53C2\u6570\u5FC5\u987B\u4E3A JSON \u5BF9\u8C61`)\n const visit = (item: unknown, depth = 0): JsonValue => {\n if (depth > 16) throw new Error(`${kind} \u53C2\u6570\u5D4C\u5957\u8FC7\u6DF1`)\n if (item === null || typeof item === 'boolean' || typeof item === 'string') return item\n if (typeof item === 'number' && Number.isFinite(item)) return item\n if (Array.isArray(item)) return Object.freeze(item.map(child => visit(child, depth + 1))) as unknown as JsonValue[]\n if (item && typeof item === 'object' && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {\n return Object.freeze(Object.fromEntries(Object.entries(item).map(([key, child]) => [key, visit(child, depth + 1)])))\n }\n throw new Error(`${kind} \u53C2\u6570\u53EA\u80FD\u5305\u542B JSON \u503C`)\n }\n const parameters = visit(value) as ModelParameters\n if (JSON.stringify(parameters).length > 16000) throw new Error(`${kind} \u53C2\u6570\u4E0D\u80FD\u8D85\u8FC7 16000 \u5B57\u7B26`)\n const reserved = kind === 'embedding' ? ['dimension', 'text_type'] : ['top_n']\n if (reserved.some(key => Object.hasOwn(parameters, key))) throw new Error(kind === 'embedding'\n ? 'dimension \u8BF7\u5728\u5411\u91CF\u7EF4\u5EA6\u4E2D\u586B\u5199\uFF1Btext_type \u7531\u5165\u5E93\u548C\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E'\n : 'top_n \u8BF7\u5728\u53EC\u56DE\u6761\u6570\u4E2D\u586B\u5199')\n if (kind === 'embedding' && parameters.output_type !== undefined && parameters.output_type !== 'dense') throw new Error('\u672C\u5730\u5411\u91CF\u68C0\u7D22\u9700\u8981 dense \u5411\u91CF\uFF0Coutput_type \u4EC5\u652F\u6301 dense')\n if (kind === 'rerank' && parameters.return_documents !== undefined && typeof parameters.return_documents !== 'boolean') throw new Error('return_documents \u5FC5\u987B\u662F\u5E03\u5C14\u503C')\n return parameters\n}\n\nexport function stableParameters(value: ModelParameters): string {\n const ordered = (item: JsonValue): JsonValue => Array.isArray(item) ? item.map(ordered)\n : item !== null && typeof item === 'object' ? Object.fromEntries(Object.keys(item).sort().map(key => [key, ordered(item[key])])) : item\n return JSON.stringify(ordered(value as JsonValue))\n}\n", "import { SettingsForm, SettingsSecretField, SettingsValueField, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { CSSProperties, ReactNode } from 'react'\nimport type { InjectFace } from '@deepseek-ai/dsh-client-ui-slots'\nimport type { DiarySettingsController, EditableField } from './controller.js'\n\ntype PageProps = InjectFace<ReturnType<DiarySettingsController['inject']>>\nconst card: CSSProperties = { border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 14, padding: '16px 20px', marginTop: 16, minWidth: 0 }\nconst hint: CSSProperties = { fontSize: 12, lineHeight: 1.6, color: 'var(--dsw-alias-label-tertiary)', margin: '8px 0 0' }\nconst 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' }\n\nfunction Group({ title, children }: { title: string; children: ReactNode }) {\n return <section aria-label={title} style={card}><h3 style={{ fontSize: 14, margin: '0 0 8px' }}>{title}</h3>{children}</section>\n}\n\nexport function DiarySettingsPage(props: PageProps) {\n const state = props.useDiarySettings(value => value)\n const disabled = !state.writable || state.saving\n const valueField = (field: EditableField, label: string, description: string, numeric = false) => <SettingsValueField\n key={field} id={`diary-${field}`} label={label} hint={description} numeric={numeric}\n {...state.fields[field]} disabled={disabled} overriddenLabel=\"\u5DF2\u81EA\u5B9A\u4E49\" resetLabel=\"\u6062\u590D\u9ED8\u8BA4\"\n invalidLabel={numeric ? '\u8BF7\u586B\u5199\u8303\u56F4\u5185\u7684\u6574\u6570\u3002' : '\u8BF7\u68C0\u67E5\u586B\u5199\u7684\u5185\u5BB9\u3002'}\n onEdit={text => props.edit(field, text)} onReset={() => props.resetField(field)}\n />\n const parameters = (field: 'embeddingParameters' | 'rerankParameters', description: string) => <div style={{ padding: '12px 0' }}>\n <label htmlFor={`diary-${field}`} style={{ display: 'block', fontSize: 13, fontWeight: 500, marginBottom: 8 }}>\u989D\u5916\u53C2\u6570\uFF08JSON\uFF09</label>\n <textarea id={`diary-${field}`} aria-describedby={`diary-${field}-hint`} aria-invalid={state.fields[field].invalid || undefined}\n value={state.fields[field].text} onChange={event => props.edit(field, event.target.value)} disabled={disabled}\n spellCheck={false} rows={5} style={textarea} />\n <p id={`diary-${field}-hint`} style={hint}>{description}</p>\n </div>\n return <div data-diary-settings style={{ color: 'var(--dsw-alias-label-primary)', paddingBottom: 16 }}>\n <h2 style={{ fontSize: 18, margin: '0 0 8px' }}>\u966A\u4F34\u65E5\u8BB0</h2>\n <p style={hint}>\u8BBE\u7F6E\u767E\u70BC\u8FDE\u63A5\u3001\u56DE\u5FC6\u6A21\u578B\u4E0E\u65E5\u8BB0\u538B\u7F29\u65B9\u5F0F\u3002\u586B\u5199\u540E\u70B9\u51FB\u4FDD\u5B58\u3002</p>\n <SettingsForm state={state} onSave={props.save} onDiscard={props.discard} labels={{\n unavailable: '\u6B63\u5728\u52A0\u8F7D\u914D\u7F6E\uFF1B\u82E5\u6301\u7EED\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u966A\u4F34\u65E5\u8BB0\u63D2\u4EF6\u662F\u5426\u5DF2\u542F\u7528\u3002', readOnly: '\u5F53\u524D\u914D\u7F6E\u53EA\u8BFB\u3002',\n saveFailed: '\u4FDD\u5B58\u5931\u8D25\u6216\u914D\u7F6E\u5DF2\u5728\u5176\u4ED6\u7A97\u53E3\u4FEE\u6539\u3002\u8F93\u5165\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u68C0\u67E5\u540E\u91CD\u8BD5\u3002', save: '\u4FDD\u5B58\u914D\u7F6E', saving: '\u6B63\u5728\u4FDD\u5B58\u2026',\n }}>\n <Group title=\"\u767E\u70BC\u8FDE\u63A5\">\n <SettingsSecretField id=\"diary-apiKey\" label=\"\u767E\u70BC API Key\" hint=\"\u5BC6\u94A5\u4E0D\u4F1A\u56DE\u663E\uFF1B\u7559\u7A7A\u4FDD\u7559\u5DF2\u4FDD\u5B58\u7684 Key\u3002\u4E5F\u53EF\u901A\u8FC7 DSH \u7684\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\u3002\"\n text={state.fields.apiKey.text} configured={state.keyConfigured} stateLabel={state.keyConfigured ? '\u5DF2\u4FDD\u5B58\uFF08\u4E0D\u56DE\u663E\uFF09' : '\u5C1A\u672A\u4FDD\u5B58'}\n disabled={disabled} onEdit={text => props.edit('apiKey', text)} />\n {valueField('baseUrl', '\u767E\u70BC API \u5730\u5740', '\u9700\u8981\u4E0E API Key \u7684\u5730\u57DF\u4E00\u81F4\uFF0C\u4F8B\u5982 https://dashscope.aliyuncs.com\u3002')}\n </Group>\n <Group title=\"Embedding \u00B7 \u5411\u91CF\u53EC\u56DE\">\n {valueField('embeddingModel', 'Embedding \u6A21\u578B\u540D', '\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u6587\u672C\u5411\u91CF\u6A21\u578B\uFF0C\u4F8B\u5982 text-embedding-v4\u3002')}\n {valueField('embeddingDimensions', '\u5411\u91CF\u7EF4\u5EA6', '1\u20134096\uFF1B\u8BF7\u586B\u5199\u6240\u9009\u6A21\u578B\u652F\u6301\u7684\u7EF4\u5EA6\u3002', true)}\n {parameters('embeddingParameters', '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {\"output_type\":\"dense\"}\u3002dimension \u5728\u4E0A\u65B9\u586B\u5199\uFF0Ctext_type \u7531\u5165\u5E93\u4E0E\u53EC\u56DE\u81EA\u52A8\u8BBE\u7F6E\u3002')}\n <p style={hint}>\u66F4\u6539 Embedding \u6A21\u578B\u3001\u7EF4\u5EA6\u6216\u53C2\u6570\u540E\uFF0C\u65E7\u5411\u91CF\u4E0D\u4F1A\u53C2\u4E0E\u65B0\u914D\u7F6E\u7684\u68C0\u7D22\u3002</p>\n </Group>\n <Group title=\"Rerank \u00B7 \u56DE\u5FC6\u6392\u5E8F\">\n {valueField('rerankModel', 'Rerank \u6A21\u578B\u540D', '\u53EF\u624B\u52A8\u586B\u5199\u767E\u70BC\u652F\u6301\u7684\u91CD\u6392\u6A21\u578B\uFF0C\u4F8B\u5982 gte-rerank-v2\u3002')}\n {valueField('candidateCount', '\u5019\u9009\u6570\u91CF', '1\u2013100\uFF1B\u5148\u7531\u5411\u91CF\u68C0\u7D22\u9009\u51FA\u8FD9\u4E9B\u65E5\u8BB0\u4EA4\u7ED9 Rerank\u3002', true)}\n {valueField('recallCount', '\u53EC\u56DE\u6761\u6570\uFF08top_n\uFF09', '1\u2013100\uFF0C\u4E14\u4E0D\u5927\u4E8E\u5019\u9009\u6570\u91CF\u3002', true)}\n {parameters('rerankParameters', '\u586B\u5199\u8BE5\u6A21\u578B\u652F\u6301\u7684 parameters\uFF0C\u4F8B\u5982 {\"return_documents\":false}\u3002top_n \u7531\u4E0A\u65B9\u7684\u53EC\u56DE\u6761\u6570\u8BBE\u7F6E\u3002')}\n </Group>\n <Group title=\"\u65E5\u8BB0\u4E0E\u966A\u4F34\">\n {valueField('compressionRounds', '\u89E6\u53D1\u538B\u7F29\u7684\u8F6E\u6B21', '\u5B8C\u6210\u591A\u5C11\u8F6E\u540E\u4FDD\u5B58\u65E5\u8BB0\u5E76\u5B89\u5168\u538B\u7F29\uFF1B\u987B\u5927\u4E8E\u4FDD\u7559\u8F6E\u6B21\u3002', true)}\n {valueField('retainRounds', '\u4FDD\u7559\u6700\u8FD1\u8F6E\u6B21', '\u81F3\u5C11\u4FDD\u7559\u6700\u8FD1\u591A\u5C11\u4E2A\u7528\u6237\u8F93\u5165\u53CA\u540E\u7EED\u6D88\u606F\u3002', true)}\n <div style={{ display: 'flex', gap: 10, justifyContent: 'space-between', alignItems: 'center', padding: '12px 0', fontSize: 13 }}>\n <span>\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0</span>\n <Switch label=\"\u81EA\u52A8\u56DE\u60F3\u76F8\u5173\u65E5\u8BB0\" checked={state.fields.autoRecall.text === 'true'} disabled={disabled}\n onChange={value => props.edit('autoRecall', String(value))} />\n </div>\n </Group>\n {state.error ? <p role=\"alert\" style={{ ...hint, color: 'var(--dsw-alias-label-error)' }}>{state.error}</p> : null}\n </SettingsForm>\n </div>\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_dsh_client_ui_primitives"]
|
|
7
|
+
}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import z from '@deepseek-ai/schemastery';
|
|
2
|
+
import type { ModelParameters } from './model-parameters.js';
|
|
3
|
+
export interface DiaryConfig {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
embeddingModel: string;
|
|
7
|
+
embeddingDimensions: number;
|
|
8
|
+
embeddingParameters: ModelParameters;
|
|
9
|
+
rerankModel: string;
|
|
10
|
+
rerankParameters: ModelParameters;
|
|
11
|
+
compressionRounds: number;
|
|
12
|
+
retainRounds: number;
|
|
13
|
+
namespace: string;
|
|
14
|
+
databasePath: string;
|
|
15
|
+
candidateCount: number;
|
|
16
|
+
recallCount: number;
|
|
17
|
+
timeoutMs: number;
|
|
18
|
+
retries: number;
|
|
19
|
+
diaryProvider: string;
|
|
20
|
+
diaryModel: string;
|
|
21
|
+
diaryMaxTokens: number;
|
|
22
|
+
diaryInputMaxChars: number;
|
|
23
|
+
recentDiaryCount: number;
|
|
24
|
+
autoRecall: boolean;
|
|
25
|
+
}
|
|
26
|
+
export type ResolvedConfig = Readonly<DiaryConfig>;
|
|
27
|
+
export declare const defaults: Readonly<{
|
|
28
|
+
apiKey: "";
|
|
29
|
+
baseUrl: "https://dashscope.aliyuncs.com";
|
|
30
|
+
embeddingModel: "text-embedding-v4";
|
|
31
|
+
embeddingDimensions: 1024;
|
|
32
|
+
embeddingParameters: Readonly<{}>;
|
|
33
|
+
rerankModel: "gte-rerank-v2";
|
|
34
|
+
rerankParameters: Readonly<{}>;
|
|
35
|
+
compressionRounds: 20;
|
|
36
|
+
retainRounds: 2;
|
|
37
|
+
namespace: "companion";
|
|
38
|
+
databasePath: "";
|
|
39
|
+
candidateCount: 30;
|
|
40
|
+
recallCount: 6;
|
|
41
|
+
timeoutMs: 30000;
|
|
42
|
+
retries: 2;
|
|
43
|
+
diaryProvider: "";
|
|
44
|
+
diaryModel: "";
|
|
45
|
+
diaryMaxTokens: 3000;
|
|
46
|
+
diaryInputMaxChars: 200000;
|
|
47
|
+
recentDiaryCount: 3;
|
|
48
|
+
autoRecall: true;
|
|
49
|
+
}>;
|
|
50
|
+
export declare const liveConfigFields: readonly ["apiKey", "baseUrl", "embeddingModel", "embeddingDimensions", "embeddingParameters", "rerankModel", "rerankParameters", "compressionRounds", "retainRounds", "candidateCount", "recallCount", "autoRecall"];
|
|
51
|
+
export type LiveConfigField = typeof liveConfigFields[number];
|
|
52
|
+
export type PluginConfig = {
|
|
53
|
+
[K in keyof DiaryConfig]: K extends LiveConfigField ? DiaryConfig[K] | {
|
|
54
|
+
get(): DiaryConfig[K] | undefined;
|
|
55
|
+
} : DiaryConfig[K];
|
|
56
|
+
};
|
|
57
|
+
/** DSH only exposes volatile fields to its settings transport. */
|
|
58
|
+
export declare const Config: z<Schemastery.ObjectS<NoInfer<{
|
|
59
|
+
apiKey: z<string, string, "volatile">;
|
|
60
|
+
baseUrl: z<string, string, "defined">;
|
|
61
|
+
embeddingModel: z<string, string, "defined">;
|
|
62
|
+
embeddingDimensions: z<number, number, "defined">;
|
|
63
|
+
embeddingParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
|
|
64
|
+
rerankModel: z<string, string, "defined">;
|
|
65
|
+
rerankParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
|
|
66
|
+
compressionRounds: z<number, number, "defined">;
|
|
67
|
+
retainRounds: z<number, number, "defined">;
|
|
68
|
+
namespace: z<string, string, "defined">;
|
|
69
|
+
databasePath: z<string, string, "defined">;
|
|
70
|
+
candidateCount: z<number, number, "defined">;
|
|
71
|
+
recallCount: z<number, number, "defined">;
|
|
72
|
+
timeoutMs: z<number, number, "defined">;
|
|
73
|
+
retries: z<number, number, "defined">;
|
|
74
|
+
diaryProvider: z<string, string, "defined">;
|
|
75
|
+
diaryModel: z<string, string, "defined">;
|
|
76
|
+
diaryMaxTokens: z<number, number, "defined">;
|
|
77
|
+
diaryInputMaxChars: z<number, number, "defined">;
|
|
78
|
+
recentDiaryCount: z<number, number, "defined">;
|
|
79
|
+
autoRecall: z<boolean, boolean, "defined">;
|
|
80
|
+
}>>, Schemastery.ObjectT<NoInfer<{
|
|
81
|
+
apiKey: z<string, string, "volatile">;
|
|
82
|
+
baseUrl: z<string, string, "defined">;
|
|
83
|
+
embeddingModel: z<string, string, "defined">;
|
|
84
|
+
embeddingDimensions: z<number, number, "defined">;
|
|
85
|
+
embeddingParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
|
|
86
|
+
rerankModel: z<string, string, "defined">;
|
|
87
|
+
rerankParameters: z<import("@deepseek-ai/cosmokit").Dict<any, string>, import("@deepseek-ai/cosmokit").Dict<any, string>, "defined">;
|
|
88
|
+
compressionRounds: z<number, number, "defined">;
|
|
89
|
+
retainRounds: z<number, number, "defined">;
|
|
90
|
+
namespace: z<string, string, "defined">;
|
|
91
|
+
databasePath: z<string, string, "defined">;
|
|
92
|
+
candidateCount: z<number, number, "defined">;
|
|
93
|
+
recallCount: z<number, number, "defined">;
|
|
94
|
+
timeoutMs: z<number, number, "defined">;
|
|
95
|
+
retries: z<number, number, "defined">;
|
|
96
|
+
diaryProvider: z<string, string, "defined">;
|
|
97
|
+
diaryModel: z<string, string, "defined">;
|
|
98
|
+
diaryMaxTokens: z<number, number, "defined">;
|
|
99
|
+
diaryInputMaxChars: z<number, number, "defined">;
|
|
100
|
+
recentDiaryCount: z<number, number, "defined">;
|
|
101
|
+
autoRecall: z<boolean, boolean, "defined">;
|
|
102
|
+
}>>, "plain">;
|
|
103
|
+
export declare function resolvePluginConfig(input?: Partial<PluginConfig>, env?: NodeJS.ProcessEnv): ResolvedConfig;
|
|
104
|
+
export declare function resolveConfig(input?: Partial<DiaryConfig>, env?: NodeJS.ProcessEnv): ResolvedConfig;
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import z from '@deepseek-ai/schemastery';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join, resolve } from 'node:path';
|
|
4
|
+
import { validateModelParameters } from './model-parameters.js';
|
|
5
|
+
export const defaults = Object.freeze({
|
|
6
|
+
apiKey: '',
|
|
7
|
+
baseUrl: 'https://dashscope.aliyuncs.com',
|
|
8
|
+
embeddingModel: 'text-embedding-v4',
|
|
9
|
+
embeddingDimensions: 1024,
|
|
10
|
+
embeddingParameters: Object.freeze({}),
|
|
11
|
+
rerankModel: 'gte-rerank-v2',
|
|
12
|
+
rerankParameters: Object.freeze({}),
|
|
13
|
+
compressionRounds: 20,
|
|
14
|
+
retainRounds: 2,
|
|
15
|
+
namespace: 'companion',
|
|
16
|
+
databasePath: '',
|
|
17
|
+
candidateCount: 30,
|
|
18
|
+
recallCount: 6,
|
|
19
|
+
timeoutMs: 30000,
|
|
20
|
+
retries: 2,
|
|
21
|
+
diaryProvider: '',
|
|
22
|
+
diaryModel: '',
|
|
23
|
+
diaryMaxTokens: 3000,
|
|
24
|
+
diaryInputMaxChars: 200000,
|
|
25
|
+
recentDiaryCount: 3,
|
|
26
|
+
autoRecall: true,
|
|
27
|
+
});
|
|
28
|
+
const fields = {
|
|
29
|
+
apiKey: z.string().role('secret').default('').description('百炼 API Key;留空读取 DSH_DIARY_BAILIAN_API_KEY 或 DASHSCOPE_API_KEY。'),
|
|
30
|
+
baseUrl: z.string().default(defaults.baseUrl).description('百炼地域端点;须与 API Key 的地域一致。'),
|
|
31
|
+
embeddingModel: z.string().default(defaults.embeddingModel),
|
|
32
|
+
embeddingDimensions: z.number().step(1).min(1).max(4096).default(defaults.embeddingDimensions),
|
|
33
|
+
embeddingParameters: z.dict(z.any()).default({}).description('Embedding API 的额外 parameters JSON;dimension 和 text_type 由插件设置。'),
|
|
34
|
+
rerankModel: z.string().default(defaults.rerankModel),
|
|
35
|
+
rerankParameters: z.dict(z.any()).default({}).description('Rerank API 的额外 parameters JSON;top_n 由召回条数设置。'),
|
|
36
|
+
compressionRounds: z.number().step(1).min(2).default(defaults.compressionRounds).description('累计完成多少个会话轮次后,在下一次安全的 pre-step 压缩。工具调用不额外计轮次。'),
|
|
37
|
+
retainRounds: z.number().step(1).min(1).default(defaults.retainRounds).description('至少保留最近多少个用户输入及其后续消息。'),
|
|
38
|
+
namespace: z.string().default(defaults.namespace).description('数字分身的记忆空间。只有使用同一空间的会话共享日记与自我演化。'),
|
|
39
|
+
databasePath: z.string().default('').description('SQLite 文件;默认位于当前 DSH profile 的 diary-memory/ 中。'),
|
|
40
|
+
candidateCount: z.number().step(1).min(1).max(100).default(defaults.candidateCount),
|
|
41
|
+
recallCount: z.number().step(1).min(1).max(100).default(defaults.recallCount),
|
|
42
|
+
timeoutMs: z.number().step(1).min(100).max(300000).default(defaults.timeoutMs),
|
|
43
|
+
retries: z.number().step(1).min(0).max(5).default(defaults.retries),
|
|
44
|
+
diaryProvider: z.string().default('').description('日记生成使用 DSH 的 LLM 路由;两个字段均留空则继承会话模型。'),
|
|
45
|
+
diaryModel: z.string().default(''),
|
|
46
|
+
diaryMaxTokens: z.number().step(1).min(256).max(16000).default(defaults.diaryMaxTokens),
|
|
47
|
+
diaryInputMaxChars: z.number().step(1).min(1000).default(defaults.diaryInputMaxChars),
|
|
48
|
+
recentDiaryCount: z.number().step(1).min(0).max(10).default(defaults.recentDiaryCount),
|
|
49
|
+
autoRecall: z.boolean().default(true).description('每个新用户输入自动检索日记,接纳到当前步骤并写入可重放的上下文。'),
|
|
50
|
+
};
|
|
51
|
+
const ValueConfig = z.object(fields);
|
|
52
|
+
export const liveConfigFields = ['apiKey', 'baseUrl', 'embeddingModel', 'embeddingDimensions', 'embeddingParameters', 'rerankModel', 'rerankParameters', 'compressionRounds', 'retainRounds', 'candidateCount', 'recallCount', 'autoRecall'];
|
|
53
|
+
/** DSH only exposes volatile fields to its settings transport. */
|
|
54
|
+
export const Config = z.object({
|
|
55
|
+
...fields,
|
|
56
|
+
...Object.fromEntries(liveConfigFields.map(key => [key, fields[key].volatile()])),
|
|
57
|
+
// No empty default on the write-only credential: the secret sidecar can report absence.
|
|
58
|
+
apiKey: z.string().role('secret').volatile().description('百炼 API Key;留空保留当前密钥。'),
|
|
59
|
+
});
|
|
60
|
+
export function resolvePluginConfig(input = {}, env = process.env) {
|
|
61
|
+
const values = Object.fromEntries(Object.entries(input).map(([key, value]) => [key,
|
|
62
|
+
liveConfigFields.includes(key) && value !== null && typeof value === 'object' && 'get' in value && typeof value.get === 'function' ? value.get() : value,
|
|
63
|
+
]));
|
|
64
|
+
// Missing optional volatile values inherit the ordinary defaults.
|
|
65
|
+
return resolveConfig(Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined)), env);
|
|
66
|
+
}
|
|
67
|
+
export function resolveConfig(input = {}, env = process.env) {
|
|
68
|
+
for (const key of Object.keys(input)) {
|
|
69
|
+
if (!(key in defaults))
|
|
70
|
+
throw new Error(`未知日记配置项:${key}`);
|
|
71
|
+
}
|
|
72
|
+
// Schemastery normalizes dictionaries in place; live references are immutable.
|
|
73
|
+
const config = ValueConfig(structuredClone({ ...defaults, ...input }));
|
|
74
|
+
const ranges = [
|
|
75
|
+
['embeddingDimensions', 1, 4096], ['compressionRounds', 2, 1000000],
|
|
76
|
+
['retainRounds', 1, 1000000], ['candidateCount', 1, 100], ['recallCount', 1, 100],
|
|
77
|
+
['timeoutMs', 100, 300000], ['retries', 0, 5], ['diaryMaxTokens', 256, 16000],
|
|
78
|
+
['diaryInputMaxChars', 1000, 10000000], ['recentDiaryCount', 0, 10],
|
|
79
|
+
];
|
|
80
|
+
for (const [key, min, max] of ranges) {
|
|
81
|
+
if (!Number.isSafeInteger(config[key]) || config[key] < min || config[key] > max) {
|
|
82
|
+
throw new Error(`${key} 必须为 ${min}–${max} 的整数`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (config.compressionRounds <= config.retainRounds)
|
|
86
|
+
throw new Error('compressionRounds 必须大于 retainRounds');
|
|
87
|
+
if (config.recallCount > config.candidateCount)
|
|
88
|
+
throw new Error('recallCount 不能大于 candidateCount');
|
|
89
|
+
config.diaryProvider = config.diaryProvider.trim();
|
|
90
|
+
config.diaryModel = config.diaryModel.trim();
|
|
91
|
+
if (Boolean(config.diaryProvider) !== Boolean(config.diaryModel))
|
|
92
|
+
throw new Error('diaryProvider 和 diaryModel 必须同时设置');
|
|
93
|
+
for (const key of ['namespace', 'embeddingModel', 'rerankModel']) {
|
|
94
|
+
config[key] = config[key].trim();
|
|
95
|
+
if (!config[key] || config[key].length > 200)
|
|
96
|
+
throw new Error(`${key} 不能为空且不能超过 200 字符`);
|
|
97
|
+
}
|
|
98
|
+
const endpoint = new URL(config.baseUrl);
|
|
99
|
+
if (endpoint.username || endpoint.password || endpoint.search || endpoint.hash || endpoint.pathname !== '/')
|
|
100
|
+
throw new Error('baseUrl 必须是无路径、凭据和查询参数的百炼 origin');
|
|
101
|
+
if (endpoint.protocol !== 'https:' && !(endpoint.protocol === 'http:' && ['127.0.0.1', '[::1]', 'localhost'].includes(endpoint.hostname)))
|
|
102
|
+
throw new Error('baseUrl 需要 HTTPS;本地测试可以使用 loopback HTTP');
|
|
103
|
+
config.baseUrl = endpoint.origin;
|
|
104
|
+
config.embeddingParameters = validateModelParameters(config.embeddingParameters, 'embedding');
|
|
105
|
+
config.rerankParameters = validateModelParameters(config.rerankParameters, 'rerank');
|
|
106
|
+
config.apiKey = config.apiKey.trim() || env.DSH_DIARY_BAILIAN_API_KEY?.trim() || env.DASHSCOPE_API_KEY?.trim() || '';
|
|
107
|
+
const profileDir = env.DSH_PROFILE_DIR?.trim() || join(env.DSH_HOME?.trim() || join(homedir(), '.dsh'), 'profiles', env.DSH_PROFILE?.trim() || 'default');
|
|
108
|
+
config.databasePath = config.databasePath || join(profileDir, 'diary-memory', 'memories.sqlite3');
|
|
109
|
+
if (config.databasePath !== ':memory:')
|
|
110
|
+
config.databasePath = resolve(config.databasePath);
|
|
111
|
+
return Object.freeze(config);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|