vome-core 0.0.65 → 0.0.67
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/admin/api/client.d.ts +17 -1
- package/dist/admin/api/client.js +75 -2
- package/dist/admin/config/plugin-dev.js +1 -1
- package/dist/admin/crud/components/vm-json-editor.vue +11 -8
- package/dist/admin/crud/components/vm-richtext.vue +5 -4
- package/dist/admin/crud/config.js +1 -1
- package/dist/admin/crud/confirm.js +1 -1
- package/dist/admin/crud/dict.js +1 -1
- package/dist/admin/crud/index.js +1 -1
- package/dist/admin/crud/key.js +1 -1
- package/dist/admin/crud/mitt.js +1 -1
- package/dist/admin/crud/plugins.js +1 -1
- package/dist/admin/crud/span.js +1 -1
- package/dist/admin/crud/style.js +1 -1
- package/dist/admin/crud/validate.js +1 -1
- package/dist/admin/crud/vm-table.vue +10 -5
- package/dist/admin/crud/vm-upsert.vue +14 -1
- package/dist/admin/directives/perm.js +1 -1
- package/dist/admin/hooks/useUpload.js +1 -1
- package/dist/admin/index.d.ts +2 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/lib/browser.js +1 -1
- package/dist/admin/lib/cn.js +1 -1
- package/dist/admin/lib/dialog-float.js +1 -1
- package/dist/admin/lib/export-excel.js +1 -1
- package/dist/admin/lib/file-preview.js +1 -1
- package/dist/admin/lib/import-excel.js +1 -1
- package/dist/admin/lib/json.js +1 -1
- package/dist/admin/lib/menu.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- package/dist/admin/lib/upload.js +1 -1
- package/dist/admin/lib/video-frame.js +1 -1
- package/dist/client/ai-model.d.ts +38 -0
- package/dist/client/ai-model.js +39 -0
- package/dist/client/base.js +23 -2
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/vite-plugin-eps.js +21 -0
- package/dist/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/excel.js +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/tree.js +1 -1
- package/package.json +1 -1
- package/typings/admin/comm/crud.d.ts +1 -0
- package/typings/admin/comm/crud.ts +1 -0
- package/typings/admin/comm/request.d.ts +2 -0
- package/typings/admin/comm/request.ts +2 -0
- package/typings/admin/comm/service.d.ts +2 -0
- package/typings/admin/comm/service.ts +2 -0
- package/dist/src/ext/market-install.test.d.ts +0 -1
- package/dist/src/orm/query-op.select.test.d.ts +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { EpsSide } from './eps';
|
|
2
|
+
export type AiInputFieldHint = {
|
|
3
|
+
key: string;
|
|
4
|
+
type: string;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
description?: string;
|
|
7
|
+
enum?: string[];
|
|
8
|
+
system?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type AiInputSchema = {
|
|
11
|
+
fields?: AiInputFieldHint[];
|
|
12
|
+
};
|
|
13
|
+
export type AiResponseSpec = {
|
|
14
|
+
textPath?: string;
|
|
15
|
+
assetsPath?: string;
|
|
16
|
+
binary?: boolean;
|
|
17
|
+
resultUrlPath?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
};
|
|
20
|
+
export type AiModelCatalogItem = {
|
|
21
|
+
code: string;
|
|
22
|
+
path: string;
|
|
23
|
+
method: string;
|
|
24
|
+
contentType: string;
|
|
25
|
+
capabilities: string[];
|
|
26
|
+
resultModes: string[];
|
|
27
|
+
inputSchema?: AiInputSchema | null;
|
|
28
|
+
responseSpec?: AiResponseSpec | null;
|
|
29
|
+
asyncSpec?: Record<string, unknown> | null;
|
|
30
|
+
defaults?: Record<string, unknown>;
|
|
31
|
+
};
|
|
32
|
+
/** 拉取启用模型目录(含 inputSchema / responseSpec),供前端 service 链消费 */
|
|
33
|
+
export declare function loadAiModelCatalog(opts?: {
|
|
34
|
+
force?: boolean;
|
|
35
|
+
side?: EpsSide;
|
|
36
|
+
}): Promise<AiModelCatalogItem[]>;
|
|
37
|
+
export declare function findAiModelCatalog(code: string, catalog?: AiModelCatalogItem[]): AiModelCatalogItem | undefined;
|
|
38
|
+
export declare function clearAiModelCatalogCache(): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { getService } from "./service";
|
|
2
|
+
let catalogCache = null;
|
|
3
|
+
let catalogPromise = null;
|
|
4
|
+
export async function loadAiModelCatalog(opts = {}) {
|
|
5
|
+
const side = opts.side ?? "admin";
|
|
6
|
+
if (!opts.force && catalogCache)
|
|
7
|
+
return catalogCache;
|
|
8
|
+
if (!opts.force && catalogPromise)
|
|
9
|
+
return catalogPromise;
|
|
10
|
+
catalogPromise = (async () => {
|
|
11
|
+
const root = getService(side);
|
|
12
|
+
const model = root.ai?.model;
|
|
13
|
+
if (!model) {
|
|
14
|
+
throw new Error("[ai-model] service.ai.model 未挂载(先 await createEps)");
|
|
15
|
+
}
|
|
16
|
+
let list;
|
|
17
|
+
if (typeof model.catalog === "function") {
|
|
18
|
+
list = await model.catalog();
|
|
19
|
+
} else if (typeof model.list === "function") {
|
|
20
|
+
list = await model.list({ status: 1 });
|
|
21
|
+
} else {
|
|
22
|
+
throw new Error("[ai-model] 无 catalog/list 接口");
|
|
23
|
+
}
|
|
24
|
+
catalogCache = list ?? [];
|
|
25
|
+
return catalogCache;
|
|
26
|
+
})();
|
|
27
|
+
try {
|
|
28
|
+
return await catalogPromise;
|
|
29
|
+
} finally {
|
|
30
|
+
catalogPromise = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function findAiModelCatalog(code, catalog) {
|
|
34
|
+
const list = catalog ?? catalogCache ?? [];
|
|
35
|
+
return list.find((m) => m.code === code);
|
|
36
|
+
}
|
|
37
|
+
export function clearAiModelCatalogCache() {
|
|
38
|
+
catalogCache = null;
|
|
39
|
+
}
|
package/dist/client/base.js
CHANGED
|
@@ -10,6 +10,23 @@ function stripTimeMeta(data) {
|
|
|
10
10
|
}
|
|
11
11
|
return data;
|
|
12
12
|
}
|
|
13
|
+
function resolveAiCallTimeoutMs(url, options) {
|
|
14
|
+
if (options.timeoutMs != null)
|
|
15
|
+
return options.timeoutMs;
|
|
16
|
+
if (/\/ai\/model\/test\/?$/.test(url))
|
|
17
|
+
return 120000;
|
|
18
|
+
if (!/\/ai\/model\/call\/?$/.test(url))
|
|
19
|
+
return;
|
|
20
|
+
const data = options.data;
|
|
21
|
+
const nested = data?.options;
|
|
22
|
+
if (nested?.timeoutMs != null)
|
|
23
|
+
return nested.timeoutMs;
|
|
24
|
+
if (data?.taskId || data?.capability === "video")
|
|
25
|
+
return 5000;
|
|
26
|
+
if (data?.capability === "chat")
|
|
27
|
+
return 0;
|
|
28
|
+
return 120000;
|
|
29
|
+
}
|
|
13
30
|
|
|
14
31
|
export class BaseService {
|
|
15
32
|
namespace;
|
|
@@ -27,6 +44,7 @@ export class BaseService {
|
|
|
27
44
|
if (!url.startsWith("/"))
|
|
28
45
|
url = `/${url}`;
|
|
29
46
|
}
|
|
47
|
+
const timeoutMs = resolveAiCallTimeoutMs(url, options);
|
|
30
48
|
const request = getClientRequest();
|
|
31
49
|
const method = (options.method || "GET").toUpperCase();
|
|
32
50
|
if (method === "GET") {
|
|
@@ -38,11 +56,14 @@ export class BaseService {
|
|
|
38
56
|
q.set(k, String(v));
|
|
39
57
|
}
|
|
40
58
|
const qs = q.toString();
|
|
41
|
-
return request(qs ? `${url}?${qs}` : url
|
|
59
|
+
return request(qs ? `${url}?${qs}` : url, {
|
|
60
|
+
timeoutMs
|
|
61
|
+
});
|
|
42
62
|
}
|
|
43
63
|
return request(url, {
|
|
44
64
|
method,
|
|
45
|
-
body: JSON.stringify(stripTimeMeta(options.data ?? {}))
|
|
65
|
+
body: JSON.stringify(stripTimeMeta(options.data ?? {})),
|
|
66
|
+
timeoutMs
|
|
46
67
|
});
|
|
47
68
|
}
|
|
48
69
|
page(data = {}) {
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { configureClient, getClientRequest, type ClientHooks, type ClientRequestFn, } from './configure';
|
|
2
2
|
export { loadEps, loadAllEps, getEps, findEpsEntity, clearEpsCache, type EpsSide, } from './eps';
|
|
3
3
|
export { BaseService } from './base';
|
|
4
|
+
export { loadAiModelCatalog, findAiModelCatalog, clearAiModelCatalogCache, type AiInputFieldHint, type AiInputSchema, type AiResponseSpec, type AiModelCatalogItem, } from './ai-model';
|
|
4
5
|
export { service, getService, createEps, bindEpsHotReload, setServicePerms, resolveService, serviceOf, type CreateEpsOptions, type ServiceLeaf, type ServiceTree, } from './service';
|
package/dist/client/index.js
CHANGED
|
@@ -11,6 +11,27 @@ function methodName(p) {
|
|
|
11
11
|
return p.replace(/^\//, "").replace(/[:,\s/-]/g, "");
|
|
12
12
|
}
|
|
13
13
|
function tsType(col) {
|
|
14
|
+
const name = col.propertyName;
|
|
15
|
+
if (name === "inputSchema") {
|
|
16
|
+
return `{
|
|
17
|
+
fields?: Array<{
|
|
18
|
+
key: string;
|
|
19
|
+
type: 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
20
|
+
required?: boolean;
|
|
21
|
+
description?: string;
|
|
22
|
+
enum?: string[];
|
|
23
|
+
system?: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
} | null`;
|
|
26
|
+
}
|
|
27
|
+
if (name === "responseSpec") {
|
|
28
|
+
return `{
|
|
29
|
+
textPath?: string;
|
|
30
|
+
assetsPath?: string;
|
|
31
|
+
binary?: boolean;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
} | null`;
|
|
34
|
+
}
|
|
14
35
|
const t = String(col.type || "string").toLowerCase();
|
|
15
36
|
if (["int", "integer", "bigint", "number", "float", "double", "decimal"].some((x) => t.includes(x)))
|
|
16
37
|
return "number";
|