@qnote/q-ai-note 1.0.3 → 1.0.4
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/dist/server/aiClient.d.ts.map +1 -1
- package/dist/server/aiClient.js +7 -0
- package/dist/server/aiClient.js.map +1 -1
- package/dist/server/api/settings.d.ts.map +1 -1
- package/dist/server/api/settings.js +16 -1
- package/dist/server/api/settings.js.map +1 -1
- package/dist/server/config.d.ts +3 -2
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +6 -1
- package/dist/server/config.js.map +1 -1
- package/dist/web/app.js +54 -0
- package/dist/web/index.html +5 -0
- package/dist/web/styles.css +19 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;
|
|
1
|
+
{"version":3,"file":"aiClient.d.ts","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,6BAA6B,CAAC,EAAE,OAAO,CAAC;CACzC;AA+BD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFxG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
|
package/dist/server/aiClient.js
CHANGED
|
@@ -2,12 +2,18 @@ import { getAllSettings } from './config.js';
|
|
|
2
2
|
function getAiSettings() {
|
|
3
3
|
const settings = getAllSettings();
|
|
4
4
|
const normalizedKey = String(settings.api_key || '').trim().replace(/^Bearer\s+/i, '');
|
|
5
|
+
const headers = settings.headers && typeof settings.headers === 'object' && !Array.isArray(settings.headers)
|
|
6
|
+
? Object.fromEntries(Object.entries(settings.headers)
|
|
7
|
+
.map(([k, v]) => [String(k || '').trim(), String(v ?? '').trim()])
|
|
8
|
+
.filter(([k, v]) => k && v))
|
|
9
|
+
: {};
|
|
5
10
|
return {
|
|
6
11
|
api_url: settings.api_url || 'https://api.minimax.com/v1',
|
|
7
12
|
api_key: normalizedKey,
|
|
8
13
|
model: settings.model || 'M2-her',
|
|
9
14
|
group_id: settings.group_id,
|
|
10
15
|
proxy: settings.proxy,
|
|
16
|
+
headers,
|
|
11
17
|
};
|
|
12
18
|
}
|
|
13
19
|
export async function callAiMessages(messages, options = {}) {
|
|
@@ -45,6 +51,7 @@ export async function callAiMessages(messages, options = {}) {
|
|
|
45
51
|
const fetchOptions = {
|
|
46
52
|
method: 'POST',
|
|
47
53
|
headers: {
|
|
54
|
+
...settings.headers,
|
|
48
55
|
'Content-Type': 'application/json',
|
|
49
56
|
Authorization: `Bearer ${settings.api_key}`,
|
|
50
57
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"aiClient.js","sourceRoot":"","sources":["../../src/server/aiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAyDxB,eAAe,MAAM,CAAC"}
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { setSetting, getAllSettings } from '../config.js';
|
|
3
3
|
const router = Router();
|
|
4
|
-
const ALLOWED_SETTING_KEYS = new Set(['api_url', 'api_key', 'model', 'group_id', 'proxy']);
|
|
4
|
+
const ALLOWED_SETTING_KEYS = new Set(['api_url', 'api_key', 'model', 'group_id', 'proxy', 'headers']);
|
|
5
|
+
function normalizeHeadersInput(value) {
|
|
6
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
7
|
+
return {};
|
|
8
|
+
const normalizedEntries = Object.entries(value)
|
|
9
|
+
.map(([k, v]) => [String(k || '').trim(), String(v ?? '').trim()])
|
|
10
|
+
.filter(([k, v]) => k && v);
|
|
11
|
+
return Object.fromEntries(normalizedEntries);
|
|
12
|
+
}
|
|
5
13
|
router.get('/', (_req, res) => {
|
|
6
14
|
try {
|
|
7
15
|
const settings = getAllSettings();
|
|
8
16
|
const sanitizedSettings = {
|
|
9
17
|
...settings,
|
|
10
18
|
has_api_key: Boolean(settings.api_key),
|
|
19
|
+
headers: normalizeHeadersInput(settings.headers),
|
|
11
20
|
};
|
|
12
21
|
delete sanitizedSettings.api_key;
|
|
13
22
|
const response = { success: true, data: sanitizedSettings };
|
|
@@ -30,6 +39,12 @@ router.put('/:key', (req, res) => {
|
|
|
30
39
|
const response = { success: false, error: 'Value is required' };
|
|
31
40
|
return res.status(400).json(response);
|
|
32
41
|
}
|
|
42
|
+
if (key === 'headers') {
|
|
43
|
+
const normalizedHeaders = normalizeHeadersInput(value);
|
|
44
|
+
setSetting('headers', normalizedHeaders);
|
|
45
|
+
const response = { success: true, data: { key, value: normalizedHeaders } };
|
|
46
|
+
return res.json(response);
|
|
47
|
+
}
|
|
33
48
|
const normalizedValue = String(value);
|
|
34
49
|
setSetting(key, normalizedValue);
|
|
35
50
|
const safeValue = key === 'api_key' ? '***' : normalizedValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/server/api/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/server/config.d.ts
CHANGED
|
@@ -4,11 +4,12 @@ interface Config {
|
|
|
4
4
|
model?: string;
|
|
5
5
|
group_id?: string;
|
|
6
6
|
proxy?: string;
|
|
7
|
+
headers?: Record<string, string>;
|
|
7
8
|
}
|
|
8
9
|
export declare function getResolvedConfigDir(): string;
|
|
9
10
|
export declare function getResolvedConfigPath(): string;
|
|
10
|
-
export declare function getSetting(key: string): string | undefined;
|
|
11
|
-
export declare function setSetting(key: string, value: string): void;
|
|
11
|
+
export declare function getSetting(key: string): string | Record<string, string> | undefined;
|
|
12
|
+
export declare function setSetting(key: string, value: string | Record<string, string>): void;
|
|
12
13
|
export declare function getAllSettings(): Config;
|
|
13
14
|
export {};
|
|
14
15
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAIA,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAoBD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAsBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAGnF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAQ7E;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
package/dist/server/config.js
CHANGED
|
@@ -47,7 +47,12 @@ export function getSetting(key) {
|
|
|
47
47
|
}
|
|
48
48
|
export function setSetting(key, value) {
|
|
49
49
|
const config = readConfig();
|
|
50
|
-
|
|
50
|
+
if (key === 'headers') {
|
|
51
|
+
config.headers = value && typeof value === 'object' ? { ...value } : {};
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
config[key] = value;
|
|
55
|
+
}
|
|
51
56
|
writeConfig(config);
|
|
52
57
|
}
|
|
53
58
|
export function getAllSettings() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/server/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAWpB,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IACxG,OAAO,eAAe,IAAI,eAAe,CAAC,IAAI,EAAE;QAC9C,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,UAAU;IACjB,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,eAAe,EAAE,CAAC;IAClB,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,GAAmB,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAsC;IAC5E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;SAAM,CAAC;QACL,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACnD,CAAC;IACD,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/web/app.js
CHANGED
|
@@ -1196,6 +1196,49 @@ async function loadSettings() {
|
|
|
1196
1196
|
apiKeyInput.value = '';
|
|
1197
1197
|
apiKeyInput.placeholder = state.settings.has_api_key ? '已配置,留空表示不修改' : 'sk-...';
|
|
1198
1198
|
document.getElementById('setting-model').value = state.settings.model || '';
|
|
1199
|
+
renderSettingHeadersRows(state.settings.headers || {});
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
function createSettingHeaderRow(key = '', value = '') {
|
|
1203
|
+
const row = document.createElement('div');
|
|
1204
|
+
row.className = 'settings-kv-row';
|
|
1205
|
+
row.innerHTML = `
|
|
1206
|
+
<input type="text" class="setting-header-key" placeholder="Header 名称" value="${escapeHtml(String(key || ''))}">
|
|
1207
|
+
<input type="text" class="setting-header-value" placeholder="Header 值" value="${escapeHtml(String(value || ''))}">
|
|
1208
|
+
<button class="btn btn-secondary btn-sm remove-setting-header-btn" type="button">删除</button>
|
|
1209
|
+
`;
|
|
1210
|
+
row.querySelector('.remove-setting-header-btn')?.addEventListener('click', () => {
|
|
1211
|
+
row.remove();
|
|
1212
|
+
});
|
|
1213
|
+
return row;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
function renderSettingHeadersRows(headers) {
|
|
1217
|
+
const list = document.getElementById('setting-headers-list');
|
|
1218
|
+
if (!(list instanceof HTMLElement)) return;
|
|
1219
|
+
list.innerHTML = '';
|
|
1220
|
+
const entries = Object.entries(headers || {}).filter(([k, v]) => String(k || '').trim() && String(v || '').trim());
|
|
1221
|
+
if (!entries.length) {
|
|
1222
|
+
list.appendChild(createSettingHeaderRow('', ''));
|
|
1223
|
+
return;
|
|
1224
|
+
}
|
|
1225
|
+
entries.forEach(([k, v]) => list.appendChild(createSettingHeaderRow(String(k), String(v))));
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
function collectSettingHeadersFromUI() {
|
|
1229
|
+
const list = document.getElementById('setting-headers-list');
|
|
1230
|
+
if (!(list instanceof HTMLElement)) return {};
|
|
1231
|
+
const rows = Array.from(list.querySelectorAll('.settings-kv-row'));
|
|
1232
|
+
const headers = {};
|
|
1233
|
+
rows.forEach((row) => {
|
|
1234
|
+
const keyInput = row.querySelector('.setting-header-key');
|
|
1235
|
+
const valueInput = row.querySelector('.setting-header-value');
|
|
1236
|
+
const key = String(keyInput?.value || '').trim();
|
|
1237
|
+
const value = String(valueInput?.value || '').trim();
|
|
1238
|
+
if (!key || !value) return;
|
|
1239
|
+
headers[key] = value;
|
|
1240
|
+
});
|
|
1241
|
+
return headers;
|
|
1199
1242
|
}
|
|
1200
1243
|
|
|
1201
1244
|
async function loadChats() {
|
|
@@ -1667,6 +1710,7 @@ function initApp() {
|
|
|
1667
1710
|
const api_url = document.getElementById('setting-api-url').value;
|
|
1668
1711
|
const api_key = document.getElementById('setting-api-key').value;
|
|
1669
1712
|
const model = document.getElementById('setting-model').value;
|
|
1713
|
+
const headers = collectSettingHeadersFromUI();
|
|
1670
1714
|
|
|
1671
1715
|
await apiRequest(`${API_BASE}/settings/api_url`, {
|
|
1672
1716
|
method: 'PUT',
|
|
@@ -1682,11 +1726,21 @@ function initApp() {
|
|
|
1682
1726
|
method: 'PUT',
|
|
1683
1727
|
body: JSON.stringify({ value: model }),
|
|
1684
1728
|
});
|
|
1729
|
+
await apiRequest(`${API_BASE}/settings/headers`, {
|
|
1730
|
+
method: 'PUT',
|
|
1731
|
+
body: JSON.stringify({ value: headers }),
|
|
1732
|
+
});
|
|
1685
1733
|
|
|
1686
1734
|
alert('设置已保存');
|
|
1687
1735
|
await loadSettings();
|
|
1688
1736
|
});
|
|
1689
1737
|
|
|
1738
|
+
document.getElementById('add-setting-header-btn')?.addEventListener('click', () => {
|
|
1739
|
+
const list = document.getElementById('setting-headers-list');
|
|
1740
|
+
if (!(list instanceof HTMLElement)) return;
|
|
1741
|
+
list.appendChild(createSettingHeaderRow('', ''));
|
|
1742
|
+
});
|
|
1743
|
+
|
|
1690
1744
|
document.getElementById('work-item-search')?.addEventListener('input', (e) => {
|
|
1691
1745
|
state.workItemSearch = e.target.value || '';
|
|
1692
1746
|
renderWorkTree();
|
package/dist/web/index.html
CHANGED
|
@@ -210,6 +210,11 @@
|
|
|
210
210
|
<label>Model</label>
|
|
211
211
|
<input type="text" id="setting-model" placeholder="abab6.5s-chat">
|
|
212
212
|
</div>
|
|
213
|
+
<div class="setting-group">
|
|
214
|
+
<label>额外 Headers</label>
|
|
215
|
+
<div class="settings-kv-list" id="setting-headers-list"></div>
|
|
216
|
+
<button class="btn btn-secondary btn-sm" id="add-setting-header-btn" type="button">+ 添加 Header</button>
|
|
217
|
+
</div>
|
|
213
218
|
<button class="btn btn-primary" id="save-settings-btn">保存</button>
|
|
214
219
|
</div>
|
|
215
220
|
</div>
|
package/dist/web/styles.css
CHANGED
|
@@ -1227,6 +1227,25 @@ h2 {
|
|
|
1227
1227
|
border-color: var(--primary);
|
|
1228
1228
|
}
|
|
1229
1229
|
|
|
1230
|
+
.settings-kv-list {
|
|
1231
|
+
display: flex;
|
|
1232
|
+
flex-direction: column;
|
|
1233
|
+
gap: 8px;
|
|
1234
|
+
margin-bottom: 8px;
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
.settings-kv-row {
|
|
1238
|
+
display: grid;
|
|
1239
|
+
grid-template-columns: 1fr 1fr auto;
|
|
1240
|
+
gap: 8px;
|
|
1241
|
+
align-items: center;
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
.settings-kv-row .setting-header-key,
|
|
1245
|
+
.settings-kv-row .setting-header-value {
|
|
1246
|
+
width: 100%;
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1230
1249
|
/* Dialog */
|
|
1231
1250
|
dialog {
|
|
1232
1251
|
position: fixed;
|