@coralai/sps-cli 0.61.0 → 0.62.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/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +2 -0
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/mediaProviders.d.ts +10 -0
- package/dist/console/routes/mediaProviders.d.ts.map +1 -0
- package/dist/console/routes/mediaProviders.js +59 -0
- package/dist/console/routes/mediaProviders.js.map +1 -0
- package/dist/console-assets/assets/{index-ejSTHvCc.js → index-B5aqtaR6.js} +205 -205
- package/dist/console-assets/assets/{index-MCJOz4CB.css → index-IdqQLk1r.css} +1 -1
- package/dist/console-assets/index.html +2 -2
- package/dist/core/tts/DoubaoTts.d.ts +2 -1
- package/dist/core/tts/DoubaoTts.d.ts.map +1 -1
- package/dist/core/tts/DoubaoTts.js +24 -1
- package/dist/core/tts/DoubaoTts.js.map +1 -1
- package/dist/engines/MonitorEngine.d.ts.map +1 -1
- package/dist/engines/MonitorEngine.js +4 -0
- package/dist/engines/MonitorEngine.js.map +1 -1
- package/dist/providers/llm/codexModel.d.ts +6 -0
- package/dist/providers/llm/codexModel.d.ts.map +1 -1
- package/dist/providers/llm/codexModel.js +29 -0
- package/dist/providers/llm/codexModel.js.map +1 -1
- package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
- package/dist/providers/mcp/spsMcpServer.js +22 -0
- package/dist/providers/mcp/spsMcpServer.js.map +1 -1
- package/dist/providers/media/adapters.d.ts +20 -0
- package/dist/providers/media/adapters.d.ts.map +1 -0
- package/dist/providers/media/adapters.js +585 -0
- package/dist/providers/media/adapters.js.map +1 -0
- package/dist/providers/media/generateAsset.d.ts +20 -0
- package/dist/providers/media/generateAsset.d.ts.map +1 -0
- package/dist/providers/media/generateAsset.js +34 -0
- package/dist/providers/media/generateAsset.js.map +1 -0
- package/dist/providers/media/mediaProviders.d.ts +46 -0
- package/dist/providers/media/mediaProviders.d.ts.map +1 -0
- package/dist/providers/media/mediaProviders.js +104 -0
- package/dist/providers/media/mediaProviders.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateAsset.d.ts","sourceRoot":"","sources":["../../../src/providers/media/generateAsset.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,eAAe,EAAwB,MAAM,qBAAqB,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAID,sFAAsF;AACtF,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqB3F"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/media/generateAsset
|
|
3
|
+
* @description 媒体生成的引擎侧入口:按 capability(kind)解析当前上下文的 provider(项目级注入 >
|
|
4
|
+
* 全局默认)→ 按 adapter 调 API → 把产物写进 cwd → 返回路径。worker 经 `generate_asset`
|
|
5
|
+
* MCP 工具调它;密钥全程留服务端,skill 只给 kind + prompt,不碰 provider/key。
|
|
6
|
+
* @layer provider
|
|
7
|
+
* @boundedContext media
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { dirname, isAbsolute, join } from 'node:path';
|
|
11
|
+
import { ADAPTERS } from './adapters.js';
|
|
12
|
+
import { resolveMediaProvider } from './mediaProviders.js';
|
|
13
|
+
const EXT_DIR = { png: 'assets', jpg: 'assets', mp3: 'assets/audio', mp4: 'assets/video', glb: 'assets/models' };
|
|
14
|
+
/** 按 kind 解析 provider + adapter,生成并落盘。抛错时消息含原因(未配 provider / adapter 未实现 / API 错)。 */
|
|
15
|
+
export async function generateAsset(input) {
|
|
16
|
+
const resolved = resolveMediaProvider(input.capability);
|
|
17
|
+
if (!resolved) {
|
|
18
|
+
throw new Error(`未配置 ${input.capability} 生成 provider —— 请在控制台"资源模型"页配一个,或让上层应用注入`);
|
|
19
|
+
}
|
|
20
|
+
const { provider, model } = resolved;
|
|
21
|
+
const adapter = ADAPTERS[provider.adapter];
|
|
22
|
+
if (!adapter) {
|
|
23
|
+
throw new Error(`adapter "${provider.adapter}"(${input.capability})尚未实现`);
|
|
24
|
+
}
|
|
25
|
+
const opts = { prompt: input.prompt, model, size: input.size, referenceUrl: input.referenceUrl };
|
|
26
|
+
const { bytes, ext } = await adapter(provider, opts);
|
|
27
|
+
// 命名:调用方给了 outPath 就用它;否则 assets/<capability>-<时间戳>.<ext>。
|
|
28
|
+
const rel = input.outPath?.trim() || join(EXT_DIR[ext] ?? 'assets', `${input.capability}-${Date.now()}.${ext}`);
|
|
29
|
+
const abs = isAbsolute(rel) ? rel : join(input.cwd, rel);
|
|
30
|
+
mkdirSync(dirname(abs), { recursive: true });
|
|
31
|
+
writeFileSync(abs, bytes);
|
|
32
|
+
return { path: rel, provider: provider.name, model, bytes: bytes.length };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=generateAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateAsset.js","sourceRoot":"","sources":["../../../src/providers/media/generateAsset.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AACvD,OAAO,EAAwB,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAoBjF,MAAM,OAAO,GAA2B,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC;AAEzI,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB;IAC3D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,UAAU,0CAA0C,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC,UAAU,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,GAAY,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;IAC1G,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAErD,2DAA2D;IAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAChH,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzD,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE1B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** 媒体能力类别(= console 标签 = skill 引用的 kind)。 */
|
|
2
|
+
export type MediaCapability = 'image' | 'video' | 'music' | 'voice' | '3d';
|
|
3
|
+
export declare const MEDIA_CAPABILITIES: readonly MediaCapability[];
|
|
4
|
+
export interface MediaProvider {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
/** 能力类别(image/video/music/voice/3d)。 */
|
|
8
|
+
capability: MediaCapability;
|
|
9
|
+
/** 适配器名 —— 决定用哪套 API 请求/响应实现(tripo / volcengine / minimax / doubao …)。 */
|
|
10
|
+
adapter: string;
|
|
11
|
+
/** 根地址。 */
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
/** API Key(只服务端持有,列表出站脱敏)。 */
|
|
14
|
+
apiKey: string;
|
|
15
|
+
/** 该 provider 提供的模型名(可多个)。 */
|
|
16
|
+
models: string[];
|
|
17
|
+
/** 能力特有的额外配置(如 voice 的 {speaker, resourceId})。 */
|
|
18
|
+
extra?: Record<string, unknown>;
|
|
19
|
+
createdAt?: string;
|
|
20
|
+
}
|
|
21
|
+
/** 列全部,或按能力过滤。 */
|
|
22
|
+
export declare function listMediaProviders(capability?: MediaCapability): MediaProvider[];
|
|
23
|
+
/** 按 id 取一个(供工具解析端点+key)。 */
|
|
24
|
+
export declare function getMediaProvider(id: string): MediaProvider | undefined;
|
|
25
|
+
/** 新增或按 id 覆盖。apiKey 传空串 = 保留原 key(前端不回传明文时用)。 */
|
|
26
|
+
export declare function upsertMediaProvider(entry: MediaProvider): MediaProvider;
|
|
27
|
+
/** 按 id 删。 */
|
|
28
|
+
export declare function deleteMediaProvider(id: string): boolean;
|
|
29
|
+
/** 出站脱敏:不回明文 apiKey,只留末 4 位提示。 */
|
|
30
|
+
export declare function publicMediaProvider(p: MediaProvider): Omit<MediaProvider, 'apiKey'> & {
|
|
31
|
+
keyMasked: string;
|
|
32
|
+
};
|
|
33
|
+
export interface MediaDefault {
|
|
34
|
+
providerId: string;
|
|
35
|
+
model?: string;
|
|
36
|
+
}
|
|
37
|
+
/** 读全部默认(按 capability)。 */
|
|
38
|
+
export declare function readMediaDefaults(): Partial<Record<MediaCapability, MediaDefault>>;
|
|
39
|
+
/** 设某能力的默认 provider/model。 */
|
|
40
|
+
export declare function setMediaDefault(capability: MediaCapability, def: MediaDefault): void;
|
|
41
|
+
/** 解析某能力当前该用的 provider:优先默认;默认缺失/失效则取该能力第一个。 */
|
|
42
|
+
export declare function resolveMediaProvider(capability: MediaCapability): {
|
|
43
|
+
provider: MediaProvider;
|
|
44
|
+
model?: string;
|
|
45
|
+
} | undefined;
|
|
46
|
+
//# sourceMappingURL=mediaProviders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaProviders.d.ts","sourceRoot":"","sources":["../../../src/providers/media/mediaProviders.ts"],"names":[],"mappings":"AAcA,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;AAE3E,eAAO,MAAM,kBAAkB,EAAE,SAAS,eAAe,EAA+C,CAAC;AAEzG,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,UAAU,EAAE,eAAe,CAAC;IAC5B,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,kBAAkB;AAClB,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,eAAe,GAAG,aAAa,EAAE,CAGhF;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEtE;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAYvE;AAED,cAAc;AACd,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAMvD;AAED,kCAAkC;AAClC,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAI3G;AAKD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,2BAA2B;AAC3B,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC,CAOlF;AAED,8BAA8B;AAC9B,wBAAgB,eAAe,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAMpF;AAED,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAOzH"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/media/mediaProviders
|
|
3
|
+
* @description **sps 自有** 的媒体生成 provider 注册表(图片/视频/音乐/语音/3D)。一张扁平表,靠
|
|
4
|
+
* `capability` 分类、`adapter` 决定调用哪套 API(各家请求/响应差异大)。schema 对齐
|
|
5
|
+
* gameforge 的 ImageProvider,但落 sps 自有位置 `~/.coral/media-providers.json`(不再
|
|
6
|
+
* 反向读 gameforge 的 game-platform 目录)。密钥只服务端持有,出站脱敏。
|
|
7
|
+
* skill 只按 `capability`(kind)引用能力,不碰 provider/key —— 见 `generate_asset` 工具。
|
|
8
|
+
* @layer provider
|
|
9
|
+
* @boundedContext media
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
export const MEDIA_CAPABILITIES = ['image', 'video', 'music', 'voice', '3d'];
|
|
15
|
+
/** sps 自有位置(不再读 game-platform)。 */
|
|
16
|
+
function file() {
|
|
17
|
+
return join(homedir(), '.coral', 'media-providers.json');
|
|
18
|
+
}
|
|
19
|
+
function readAll() {
|
|
20
|
+
const p = file();
|
|
21
|
+
try {
|
|
22
|
+
return existsSync(p) ? JSON.parse(readFileSync(p, 'utf-8')) : [];
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function writeAll(list) {
|
|
29
|
+
const p = file();
|
|
30
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
31
|
+
writeFileSync(p, `${JSON.stringify(list, null, 2)}\n`);
|
|
32
|
+
}
|
|
33
|
+
/** 列全部,或按能力过滤。 */
|
|
34
|
+
export function listMediaProviders(capability) {
|
|
35
|
+
const all = readAll();
|
|
36
|
+
return capability ? all.filter((p) => p.capability === capability) : all;
|
|
37
|
+
}
|
|
38
|
+
/** 按 id 取一个(供工具解析端点+key)。 */
|
|
39
|
+
export function getMediaProvider(id) {
|
|
40
|
+
return readAll().find((p) => p.id === id);
|
|
41
|
+
}
|
|
42
|
+
/** 新增或按 id 覆盖。apiKey 传空串 = 保留原 key(前端不回传明文时用)。 */
|
|
43
|
+
export function upsertMediaProvider(entry) {
|
|
44
|
+
const list = readAll();
|
|
45
|
+
const idx = list.findIndex((p) => p.id === entry.id);
|
|
46
|
+
const merged = {
|
|
47
|
+
...entry,
|
|
48
|
+
apiKey: entry.apiKey || (idx >= 0 ? list[idx].apiKey : ''),
|
|
49
|
+
createdAt: idx >= 0 ? (list[idx].createdAt ?? entry.createdAt) : (entry.createdAt ?? new Date().toISOString()),
|
|
50
|
+
};
|
|
51
|
+
if (idx >= 0)
|
|
52
|
+
list[idx] = merged;
|
|
53
|
+
else
|
|
54
|
+
list.push(merged);
|
|
55
|
+
writeAll(list);
|
|
56
|
+
return merged;
|
|
57
|
+
}
|
|
58
|
+
/** 按 id 删。 */
|
|
59
|
+
export function deleteMediaProvider(id) {
|
|
60
|
+
const list = readAll();
|
|
61
|
+
const next = list.filter((p) => p.id !== id);
|
|
62
|
+
if (next.length === list.length)
|
|
63
|
+
return false;
|
|
64
|
+
writeAll(next);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
/** 出站脱敏:不回明文 apiKey,只留末 4 位提示。 */
|
|
68
|
+
export function publicMediaProvider(p) {
|
|
69
|
+
const { apiKey, ...rest } = p;
|
|
70
|
+
const keyMasked = apiKey ? `••••${apiKey.slice(-4)}` : '';
|
|
71
|
+
return { ...rest, keyMasked };
|
|
72
|
+
}
|
|
73
|
+
function defaultsFile() {
|
|
74
|
+
return join(homedir(), '.coral', 'media-defaults.json');
|
|
75
|
+
}
|
|
76
|
+
/** 读全部默认(按 capability)。 */
|
|
77
|
+
export function readMediaDefaults() {
|
|
78
|
+
try {
|
|
79
|
+
const p = defaultsFile();
|
|
80
|
+
return existsSync(p) ? JSON.parse(readFileSync(p, 'utf-8')) : {};
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** 设某能力的默认 provider/model。 */
|
|
87
|
+
export function setMediaDefault(capability, def) {
|
|
88
|
+
const all = readMediaDefaults();
|
|
89
|
+
all[capability] = def;
|
|
90
|
+
const p = defaultsFile();
|
|
91
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
92
|
+
writeFileSync(p, `${JSON.stringify(all, null, 2)}\n`);
|
|
93
|
+
}
|
|
94
|
+
/** 解析某能力当前该用的 provider:优先默认;默认缺失/失效则取该能力第一个。 */
|
|
95
|
+
export function resolveMediaProvider(capability) {
|
|
96
|
+
const list = listMediaProviders(capability);
|
|
97
|
+
if (list.length === 0)
|
|
98
|
+
return undefined;
|
|
99
|
+
const def = readMediaDefaults()[capability];
|
|
100
|
+
const provider = (def?.providerId && list.find((p) => p.id === def.providerId)) || list[0];
|
|
101
|
+
const model = def?.model ?? provider.models[0];
|
|
102
|
+
return { provider, model };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=mediaProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mediaProviders.js","sourceRoot":"","sources":["../../../src/providers/media/mediaProviders.ts"],"names":[],"mappings":"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"}
|