@playcraft/common 0.0.19 → 0.0.21
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/messenger/server.d.ts +21 -1
- package/dist/messenger/server.d.ts.map +1 -1
- package/dist/messenger/server.js +31 -5
- package/dist/messenger/server.js.map +1 -1
- package/dist/recommend/algorithms.d.ts +27 -0
- package/dist/recommend/algorithms.d.ts.map +1 -0
- package/dist/recommend/algorithms.js +285 -0
- package/dist/recommend/algorithms.js.map +1 -0
- package/dist/recommend/api-types.d.ts +119 -0
- package/dist/recommend/api-types.d.ts.map +1 -0
- package/dist/recommend/api-types.js +11 -0
- package/dist/recommend/api-types.js.map +1 -0
- package/dist/recommend/index.d.ts +4 -0
- package/dist/recommend/index.d.ts.map +1 -0
- package/dist/recommend/index.js +4 -0
- package/dist/recommend/index.js.map +1 -0
- package/dist/recommend/types.d.ts +154 -0
- package/dist/recommend/types.d.ts.map +1 -0
- package/dist/recommend/types.js +43 -0
- package/dist/recommend/types.js.map +1 -0
- package/package.json +5 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS,
|
|
1
|
+
export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
|
|
2
2
|
export type { McpToolDefinition } from './tools.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mcp/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS,
|
|
1
|
+
export { TOOL_NAME_TO_HANDLER, EXECUTOR_ONLY_TOOLS, toolNameToHandler, MCP_TOOL_NAMES, MCP_TOOL_DEFINITIONS, } from './tools.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
@@ -48,6 +48,18 @@ export declare class MessengerServer {
|
|
|
48
48
|
constructor(options?: MessengerServerOptions);
|
|
49
49
|
attach(server: http.Server): void;
|
|
50
50
|
close(): void;
|
|
51
|
+
/**
|
|
52
|
+
* 对本进程内连接的 WebSocket 客户端进行广播(按 projectId 过滤)。
|
|
53
|
+
*
|
|
54
|
+
* 注意:在多副本 messenger 部署中,如果客户端连接到的是不同的 pod,此方法不会跨 pod。
|
|
55
|
+
* 跨 pod 分发请使用 {@link createEmitHandler} 的 `onEmit` 钩子,
|
|
56
|
+
* 由上层(如 Redis Pub/Sub)fan-out 后,每个 pod 再在订阅端调用本方法。
|
|
57
|
+
*/
|
|
58
|
+
broadcastLocal(name: string, data: any, projectId?: string | number): void;
|
|
59
|
+
/**
|
|
60
|
+
* 兼容旧调用的 broadcast 方法,内部等价于 {@link broadcastLocal}。
|
|
61
|
+
* 新代码建议直接调用 `broadcastLocal`,以明确"仅本进程"的语义。
|
|
62
|
+
*/
|
|
51
63
|
broadcast(name: string, data: any, projectId?: string | number): void;
|
|
52
64
|
send(ws: WebSocket, name: string, data: any, projectId?: string | number): void;
|
|
53
65
|
/**
|
|
@@ -57,8 +69,16 @@ export declare class MessengerServer {
|
|
|
57
69
|
/**
|
|
58
70
|
* 创建一个兼容现有 messenger 的 /emit HTTP handler(给 backend 内部调用)。
|
|
59
71
|
* 认证头:使用 HEADERS.INTERNAL_SECRET 常量
|
|
72
|
+
*
|
|
73
|
+
* @param emitSecret 内部服务鉴权密钥(与 backend EMIT_SECRET 一致)
|
|
74
|
+
* @param onEmit 可选钩子:收到合法 emit 后调用。用于接入 Redis Pub/Sub 实现跨 pod 广播。
|
|
75
|
+
* 未提供时回退为 `broadcastLocal`,仅对本进程内的客户端广播(单副本或 CLI 模式)。
|
|
60
76
|
*/
|
|
61
|
-
createEmitHandler(emitSecret: string
|
|
77
|
+
createEmitHandler(emitSecret: string, onEmit?: (msg: {
|
|
78
|
+
name: string;
|
|
79
|
+
data: any;
|
|
80
|
+
projectId?: string | number;
|
|
81
|
+
}) => void | Promise<void>): (req: http.IncomingMessage, res: http.ServerResponse) => void;
|
|
62
82
|
private handleConnection;
|
|
63
83
|
private getDefaultPermissions;
|
|
64
84
|
private parseInbound;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;IACtH,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,oBAAoB;;;;;;;;CAQvB,CAAC;AA4BX,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,6BAA6B;IAC7B,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7E,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AASF,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,OAAO,GAAE,sBAA2B;IAMhD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAM1B,KAAK;IAIL,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAKhD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE;YAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;IACtH,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,oBAAoB;;;;;;;;CAQvB,CAAC;AA4BX,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,6BAA6B;IAC7B,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7E,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AASF,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAC,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,OAAO,GAAE,sBAA2B;IAMhD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM;IAM1B,KAAK;IAIL;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAcnE;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAI9D,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAMxE;;OAEG;IACH,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;IAmBpF;;;;;;;OAOG;IACH,iBAAiB,CACf,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAExF,KAAK,IAAI,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,cAAc;IAwC7D,OAAO,CAAC,gBAAgB;IA8FxB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,YAAY;CAgCrB"}
|
package/dist/messenger/server.js
CHANGED
|
@@ -55,7 +55,14 @@ export class MessengerServer {
|
|
|
55
55
|
close() {
|
|
56
56
|
this.wss?.close();
|
|
57
57
|
}
|
|
58
|
-
|
|
58
|
+
/**
|
|
59
|
+
* 对本进程内连接的 WebSocket 客户端进行广播(按 projectId 过滤)。
|
|
60
|
+
*
|
|
61
|
+
* 注意:在多副本 messenger 部署中,如果客户端连接到的是不同的 pod,此方法不会跨 pod。
|
|
62
|
+
* 跨 pod 分发请使用 {@link createEmitHandler} 的 `onEmit` 钩子,
|
|
63
|
+
* 由上层(如 Redis Pub/Sub)fan-out 后,每个 pod 再在订阅端调用本方法。
|
|
64
|
+
*/
|
|
65
|
+
broadcastLocal(name, data, projectId) {
|
|
59
66
|
const pid = Number(projectId) || 1;
|
|
60
67
|
const json = MessengerProtocol.serialize(MessengerProtocol.createMessage(name, data, pid));
|
|
61
68
|
let sentCount = 0;
|
|
@@ -67,7 +74,14 @@ export class MessengerServer {
|
|
|
67
74
|
client.send(json);
|
|
68
75
|
sentCount++;
|
|
69
76
|
}
|
|
70
|
-
console.log(`[MessengerServer] Broadcast '${name}' to ${sentCount} clients (projectId: ${projectId})`);
|
|
77
|
+
console.log(`[MessengerServer] Broadcast(local) '${name}' to ${sentCount} clients (projectId: ${projectId})`);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 兼容旧调用的 broadcast 方法,内部等价于 {@link broadcastLocal}。
|
|
81
|
+
* 新代码建议直接调用 `broadcastLocal`,以明确"仅本进程"的语义。
|
|
82
|
+
*/
|
|
83
|
+
broadcast(name, data, projectId) {
|
|
84
|
+
this.broadcastLocal(name, data, projectId);
|
|
71
85
|
}
|
|
72
86
|
send(ws, name, data, projectId) {
|
|
73
87
|
if (ws.readyState !== WebSocket.OPEN)
|
|
@@ -99,8 +113,12 @@ export class MessengerServer {
|
|
|
99
113
|
/**
|
|
100
114
|
* 创建一个兼容现有 messenger 的 /emit HTTP handler(给 backend 内部调用)。
|
|
101
115
|
* 认证头:使用 HEADERS.INTERNAL_SECRET 常量
|
|
116
|
+
*
|
|
117
|
+
* @param emitSecret 内部服务鉴权密钥(与 backend EMIT_SECRET 一致)
|
|
118
|
+
* @param onEmit 可选钩子:收到合法 emit 后调用。用于接入 Redis Pub/Sub 实现跨 pod 广播。
|
|
119
|
+
* 未提供时回退为 `broadcastLocal`,仅对本进程内的客户端广播(单副本或 CLI 模式)。
|
|
102
120
|
*/
|
|
103
|
-
createEmitHandler(emitSecret) {
|
|
121
|
+
createEmitHandler(emitSecret, onEmit) {
|
|
104
122
|
return (req, res) => {
|
|
105
123
|
if (req.method !== 'POST' || req.url !== '/emit') {
|
|
106
124
|
res.statusCode = 404;
|
|
@@ -119,8 +137,16 @@ export class MessengerServer {
|
|
|
119
137
|
try {
|
|
120
138
|
const msg = JSON.parse(body || '{}');
|
|
121
139
|
console.log('[MessengerServer] Emit received:', msg.name, 'to project:', msg.projectId, 'data:', JSON.stringify(msg.data || {}).substring(0, 150));
|
|
122
|
-
|
|
123
|
-
|
|
140
|
+
if (onEmit) {
|
|
141
|
+
Promise.resolve(onEmit(msg)).catch((err) => {
|
|
142
|
+
console.error('[MessengerServer] onEmit hook failed, falling back to local broadcast:', err);
|
|
143
|
+
this.broadcastLocal(msg.name, msg.data, msg.projectId);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.broadcastLocal(msg.name, msg.data, msg.projectId);
|
|
148
|
+
}
|
|
149
|
+
console.log('[MessengerServer] Emit dispatched:', msg.name);
|
|
124
150
|
res.statusCode = 200;
|
|
125
151
|
res.end('ok');
|
|
126
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/messenger/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend 模块的纯算法层。
|
|
3
|
+
*
|
|
4
|
+
* 本文件由 packages/frontend/src/lib/recommend/engine.ts 整体迁移而来,
|
|
5
|
+
* 仅修改 import 路径(改用本包 ./types),其余逻辑/数值/排序行为保持 1:1。
|
|
6
|
+
*
|
|
7
|
+
* 设计约束:
|
|
8
|
+
* - 全部为无副作用的纯函数,可被 backend / cli / frontend / worker 直接调用
|
|
9
|
+
* - 不引入新依赖,不读环境变量,不做 IO
|
|
10
|
+
* - 任何修改都必须配套更新 algorithms.test.ts 中的 fixture 校验
|
|
11
|
+
*/
|
|
12
|
+
import { type Creative, type ImprovementSuggestion, type KnnResult, type Metric, type OptimalCombination, type RecommendData, type SimilarCreativeItem } from './types.js';
|
|
13
|
+
export declare function uniformHamming(a: Record<string, string | null>, b: Record<string, string | null>, cols?: readonly string[]): number;
|
|
14
|
+
export declare function weightedHamming(a: Record<string, string | null>, b: Record<string, string | null>, weights: Record<string, number>, cols?: readonly string[]): number;
|
|
15
|
+
export declare function knnPredict(targetTags: Record<string, string | null>, channel: string, data: RecommendData, metric?: Metric, k?: number): KnnResult | null;
|
|
16
|
+
export declare function getImprovements(creative: Creative, channel: string, data: RecommendData, metric?: Metric): ImprovementSuggestion[];
|
|
17
|
+
export declare function tagToAtom(tags: Record<string, string | null>, data: RecommendData): Record<string, string | number>;
|
|
18
|
+
/**
|
|
19
|
+
* 对每个 mappable 维度从枚举值均匀随机取一个。
|
|
20
|
+
*
|
|
21
|
+
* @param data 数据快照
|
|
22
|
+
* @param rng 可选的 0~1 随机数生成器,默认为 Math.random;CLI 需要可复现时传入种子化 RNG
|
|
23
|
+
*/
|
|
24
|
+
export declare function randomTags(data: RecommendData, rng?: () => number): Record<string, string | null>;
|
|
25
|
+
export declare function findSimilarCreatives(tags: Record<string, string | null>, channel: string, data: RecommendData, metric?: Metric, topN?: number): SimilarCreativeItem[];
|
|
26
|
+
export declare function generateOptimalCombinations(channel: string, data: RecommendData, metric: Metric, topK?: number): OptimalCombination[];
|
|
27
|
+
//# sourceMappingURL=algorithms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithms.d.ts","sourceRoot":"","sources":["../../src/recommend/algorithms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAEd,KAAK,MAAM,EACX,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAkBpB,wBAAgB,cAAc,CAC5B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,IAAI,GAAE,SAAS,MAAM,EAAkB,GACtC,MAAM,CAWR;AAED,wBAAgB,eAAe,CAC7B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,GAAE,SAAS,MAAM,EAAkB,GACtC,MAAM,CAYR;AAID,wBAAgB,UAAU,CACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,EACtB,CAAC,SAAI,GACJ,SAAS,GAAG,IAAI,CAiClB;AAID,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,GACrB,qBAAqB,EAAE,CAmDzB;AAID,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACnC,IAAI,EAAE,aAAa,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAkDjC;AAID;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,aAAa,EACnB,GAAG,GAAE,MAAM,MAAoB,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAQ/B;AAID,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAc,EACtB,IAAI,SAAI,GACP,mBAAmB,EAAE,CAevB;AAID,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,SAAI,GACP,kBAAkB,EAAE,CAwEtB"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend 模块的纯算法层。
|
|
3
|
+
*
|
|
4
|
+
* 本文件由 packages/frontend/src/lib/recommend/engine.ts 整体迁移而来,
|
|
5
|
+
* 仅修改 import 路径(改用本包 ./types),其余逻辑/数值/排序行为保持 1:1。
|
|
6
|
+
*
|
|
7
|
+
* 设计约束:
|
|
8
|
+
* - 全部为无副作用的纯函数,可被 backend / cli / frontend / worker 直接调用
|
|
9
|
+
* - 不引入新依赖,不读环境变量,不做 IO
|
|
10
|
+
* - 任何修改都必须配套更新 algorithms.test.ts 中的 fixture 校验
|
|
11
|
+
*/
|
|
12
|
+
import { MAPPABLE_TAGS, METRIC_CONFIG, } from './types.js';
|
|
13
|
+
// ─── 内部辅助函数 ─────────────────────────────────────────────────────────
|
|
14
|
+
function getMetricValue(c, metric) {
|
|
15
|
+
return c[METRIC_CONFIG[metric].field] ?? 0;
|
|
16
|
+
}
|
|
17
|
+
function getStatValue(s, metric) {
|
|
18
|
+
return s[METRIC_CONFIG[metric].statField] ?? 0;
|
|
19
|
+
}
|
|
20
|
+
function getWeights(data, channel, metric) {
|
|
21
|
+
return data.channelWeights[channel]?.[metric] ?? {};
|
|
22
|
+
}
|
|
23
|
+
// ─── 距离函数 ─────────────────────────────────────────────────────────────
|
|
24
|
+
export function uniformHamming(a, b, cols = MAPPABLE_TAGS) {
|
|
25
|
+
let dist = 0;
|
|
26
|
+
let compared = 0;
|
|
27
|
+
for (const c of cols) {
|
|
28
|
+
const va = a[c];
|
|
29
|
+
const vb = b[c];
|
|
30
|
+
if (va == null && vb == null)
|
|
31
|
+
continue;
|
|
32
|
+
compared++;
|
|
33
|
+
if (va !== vb)
|
|
34
|
+
dist++;
|
|
35
|
+
}
|
|
36
|
+
return compared > 0 ? dist / compared : 0;
|
|
37
|
+
}
|
|
38
|
+
export function weightedHamming(a, b, weights, cols = MAPPABLE_TAGS) {
|
|
39
|
+
let dist = 0;
|
|
40
|
+
let wSum = 0;
|
|
41
|
+
for (const c of cols) {
|
|
42
|
+
const va = a[c];
|
|
43
|
+
const vb = b[c];
|
|
44
|
+
if (va == null && vb == null)
|
|
45
|
+
continue;
|
|
46
|
+
const w = weights[c] ?? 0;
|
|
47
|
+
wSum += w;
|
|
48
|
+
if (va !== vb)
|
|
49
|
+
dist += w;
|
|
50
|
+
}
|
|
51
|
+
return wSum > 0 ? dist / wSum : 0;
|
|
52
|
+
}
|
|
53
|
+
// ─── KNN 预估 ─────────────────────────────────────────────────────────────
|
|
54
|
+
export function knnPredict(targetTags, channel, data, metric = 'ctr', k = 5) {
|
|
55
|
+
const weights = getWeights(data, channel, metric);
|
|
56
|
+
const items = data.creatives.filter((c) => c.tags['投放渠道'] === channel);
|
|
57
|
+
if (!items.length || !Object.keys(weights).length)
|
|
58
|
+
return null;
|
|
59
|
+
const dists = items.map((c) => ({
|
|
60
|
+
creative: c,
|
|
61
|
+
distance: weightedHamming(targetTags, c.tags, weights),
|
|
62
|
+
}));
|
|
63
|
+
dists.sort((a, b) => a.distance - b.distance);
|
|
64
|
+
const neighbors = dists.slice(0, k);
|
|
65
|
+
if (!neighbors.length)
|
|
66
|
+
return null;
|
|
67
|
+
const predicted = neighbors.reduce((sum, n) => sum + getMetricValue(n.creative, metric), 0) / neighbors.length;
|
|
68
|
+
// Leave-one-out 风格的 rank 计算:对每条素材都做一次 KNN(排除自身),
|
|
69
|
+
// 得到全体预测分布,再看 neighbor[0] 在分布里的位置作为相对排名信号。
|
|
70
|
+
const allPredictions = items.map((item) => {
|
|
71
|
+
const others = items.filter((o) => o !== item);
|
|
72
|
+
const d = others.map((o) => ({
|
|
73
|
+
dist: weightedHamming(item.tags, o.tags, weights),
|
|
74
|
+
val: getMetricValue(o, metric),
|
|
75
|
+
}));
|
|
76
|
+
d.sort((a, b) => a.dist - b.dist);
|
|
77
|
+
return d.slice(0, k).reduce((s, x) => s + x.val, 0) / k;
|
|
78
|
+
});
|
|
79
|
+
const higherIsBetter = METRIC_CONFIG[metric].higherIsBetter;
|
|
80
|
+
const sortedPreds = [...allPredictions].sort((a, b) => (higherIsBetter ? b - a : a - b));
|
|
81
|
+
const rank = sortedPreds.indexOf(allPredictions[items.indexOf(neighbors[0]?.creative)]) + 1;
|
|
82
|
+
return { predicted: Math.round(predicted * 100) / 100, neighbors, rank };
|
|
83
|
+
}
|
|
84
|
+
// ─── 改进建议(R1 单维优化) ────────────────────────────────────────────────
|
|
85
|
+
export function getImprovements(creative, channel, data, metric = 'ctr') {
|
|
86
|
+
const weights = getWeights(data, channel, metric);
|
|
87
|
+
const dimStats = data.dimValueStats[channel];
|
|
88
|
+
if (!Object.keys(weights).length || !dimStats)
|
|
89
|
+
return [];
|
|
90
|
+
const higherIsBetter = METRIC_CONFIG[metric].higherIsBetter;
|
|
91
|
+
const suggestions = [];
|
|
92
|
+
for (const dim of MAPPABLE_TAGS) {
|
|
93
|
+
const currentVal = creative.tags[dim];
|
|
94
|
+
const stats = dimStats[dim];
|
|
95
|
+
if (!stats)
|
|
96
|
+
continue;
|
|
97
|
+
const currentAvg = currentVal && stats[currentVal] ? getStatValue(stats[currentVal], metric) : getMetricValue(creative, metric);
|
|
98
|
+
const currentN = currentVal && stats[currentVal] ? stats[currentVal].count : 0;
|
|
99
|
+
let bestVal = '';
|
|
100
|
+
let bestAvg = higherIsBetter ? -Infinity : Infinity;
|
|
101
|
+
let bestN = 0;
|
|
102
|
+
for (const [val, s] of Object.entries(stats)) {
|
|
103
|
+
if (val === currentVal)
|
|
104
|
+
continue;
|
|
105
|
+
const v = getStatValue(s, metric);
|
|
106
|
+
const isBetter = higherIsBetter ? v > bestAvg : v < bestAvg;
|
|
107
|
+
if (isBetter) {
|
|
108
|
+
bestAvg = v;
|
|
109
|
+
bestVal = val;
|
|
110
|
+
bestN = s.count;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const improved = higherIsBetter ? bestAvg > currentAvg : bestAvg < currentAvg;
|
|
114
|
+
if (!bestVal || !improved)
|
|
115
|
+
continue;
|
|
116
|
+
suggestions.push({
|
|
117
|
+
dimension: dim,
|
|
118
|
+
currentValue: currentVal,
|
|
119
|
+
suggestedValue: bestVal,
|
|
120
|
+
omega2: weights[dim] ?? 0,
|
|
121
|
+
currentAvg,
|
|
122
|
+
suggestedAvg: bestAvg,
|
|
123
|
+
delta: Math.round((bestAvg - currentAvg) * 100) / 100,
|
|
124
|
+
sampleSize: { from: currentN, to: bestN },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
suggestions.sort((a, b) => {
|
|
128
|
+
const scoreA = a.omega2 * Math.abs(a.delta);
|
|
129
|
+
const scoreB = b.omega2 * Math.abs(b.delta);
|
|
130
|
+
return scoreB - scoreA;
|
|
131
|
+
});
|
|
132
|
+
return suggestions;
|
|
133
|
+
}
|
|
134
|
+
// ─── Tag → Atom 映射 ──────────────────────────────────────────────────────
|
|
135
|
+
export function tagToAtom(tags, data) {
|
|
136
|
+
const atoms = {};
|
|
137
|
+
const slotMap = {
|
|
138
|
+
玩法类型: 'gameplay_type',
|
|
139
|
+
布局造型: 'layout_preset',
|
|
140
|
+
包装方式: 'packaging',
|
|
141
|
+
情感元素: 'emotion_elements',
|
|
142
|
+
计分方式: 'scoring_mode',
|
|
143
|
+
限时机制: 'time_limit',
|
|
144
|
+
};
|
|
145
|
+
for (const [tagDim, slotId] of Object.entries(slotMap)) {
|
|
146
|
+
const val = tags[tagDim];
|
|
147
|
+
if (val)
|
|
148
|
+
atoms[slotId] = val;
|
|
149
|
+
}
|
|
150
|
+
const bgMap = {
|
|
151
|
+
公园: 'A lush park scene with benches and trees',
|
|
152
|
+
咖啡厅: 'A cozy coffee shop interior',
|
|
153
|
+
社区: 'A friendly community neighborhood',
|
|
154
|
+
野餐: 'An outdoor picnic in a meadow',
|
|
155
|
+
庭院: 'A peaceful courtyard garden',
|
|
156
|
+
爆金币特效: 'Gold coin burst explosion effect',
|
|
157
|
+
};
|
|
158
|
+
if (tags['背景场景'] && bgMap[tags['背景场景']]) {
|
|
159
|
+
atoms['background'] = bgMap[tags['背景场景']];
|
|
160
|
+
}
|
|
161
|
+
const tileMap = {
|
|
162
|
+
默认: 'Classic clean default tile style',
|
|
163
|
+
卡通休闲: 'Cartoon casual cute tile design',
|
|
164
|
+
暗黑: 'Dark gothic shadow tile style',
|
|
165
|
+
金块: 'Golden nugget tile texture',
|
|
166
|
+
花色: 'Floral flower pattern tile',
|
|
167
|
+
原皮: 'Original raw skin tile',
|
|
168
|
+
};
|
|
169
|
+
if (tags['牌面风格'] && tileMap[tags['牌面风格']]) {
|
|
170
|
+
atoms['tiles'] = tileMap[tags['牌面风格']];
|
|
171
|
+
}
|
|
172
|
+
for (const slot of data.atomSlots) {
|
|
173
|
+
if (slot.kind === 'parametric' && slot.range && !atoms[slot.id]) {
|
|
174
|
+
atoms[slot.id] = Math.round((slot.range.min + slot.range.max) / 2 / slot.range.step) * slot.range.step;
|
|
175
|
+
}
|
|
176
|
+
if (slot.kind === 'fixed' && slot.options && !atoms[slot.id]) {
|
|
177
|
+
atoms[slot.id] = slot.options[0];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return atoms;
|
|
181
|
+
}
|
|
182
|
+
// ─── 随机 Tag 组合 ────────────────────────────────────────────────────────
|
|
183
|
+
/**
|
|
184
|
+
* 对每个 mappable 维度从枚举值均匀随机取一个。
|
|
185
|
+
*
|
|
186
|
+
* @param data 数据快照
|
|
187
|
+
* @param rng 可选的 0~1 随机数生成器,默认为 Math.random;CLI 需要可复现时传入种子化 RNG
|
|
188
|
+
*/
|
|
189
|
+
export function randomTags(data, rng = Math.random) {
|
|
190
|
+
const tags = {};
|
|
191
|
+
for (const dim of data.tagDimensions) {
|
|
192
|
+
if (!dim.mappable)
|
|
193
|
+
continue;
|
|
194
|
+
const vals = dim.values;
|
|
195
|
+
tags[dim.id] = vals[Math.floor(rng() * vals.length)].id;
|
|
196
|
+
}
|
|
197
|
+
return tags;
|
|
198
|
+
}
|
|
199
|
+
// ─── 相似 Creative 检索 ───────────────────────────────────────────────────
|
|
200
|
+
export function findSimilarCreatives(tags, channel, data, metric = 'ctr', topN = 5) {
|
|
201
|
+
const weights = getWeights(data, channel, metric);
|
|
202
|
+
const items = data.creatives.filter((c) => c.tags['投放渠道'] === channel);
|
|
203
|
+
if (!items.length)
|
|
204
|
+
return [];
|
|
205
|
+
return items
|
|
206
|
+
.map((c) => {
|
|
207
|
+
const distance = Object.keys(weights).length
|
|
208
|
+
? weightedHamming(tags, c.tags, weights)
|
|
209
|
+
: uniformHamming(tags, c.tags);
|
|
210
|
+
const matchingDims = MAPPABLE_TAGS.filter((d) => tags[d] === c.tags[d] && tags[d] != null);
|
|
211
|
+
return { creative: c, distance, matchingDims };
|
|
212
|
+
})
|
|
213
|
+
.sort((a, b) => a.distance - b.distance)
|
|
214
|
+
.slice(0, topN);
|
|
215
|
+
}
|
|
216
|
+
// ─── 理论最优组合(堆扩展) ────────────────────────────────────────────────
|
|
217
|
+
export function generateOptimalCombinations(channel, data, metric, topK = 5) {
|
|
218
|
+
const weights = getWeights(data, channel, metric);
|
|
219
|
+
const dimStats = data.dimValueStats[channel];
|
|
220
|
+
if (!dimStats)
|
|
221
|
+
return [];
|
|
222
|
+
const cfg = METRIC_CONFIG[metric];
|
|
223
|
+
const statField = cfg.statField;
|
|
224
|
+
const higherIsBetter = cfg.higherIsBetter;
|
|
225
|
+
const dimRanked = {};
|
|
226
|
+
for (const dim of MAPPABLE_TAGS) {
|
|
227
|
+
const stats = dimStats[dim];
|
|
228
|
+
if (!stats)
|
|
229
|
+
continue;
|
|
230
|
+
dimRanked[dim] = Object.entries(stats)
|
|
231
|
+
.map(([val, s]) => ({ value: val, avg: s[statField] ?? 0 }))
|
|
232
|
+
.filter((e) => e.avg !== 0 || Object.keys(stats).length <= 1)
|
|
233
|
+
.sort((a, b) => (higherIsBetter ? b.avg - a.avg : a.avg - b.avg));
|
|
234
|
+
}
|
|
235
|
+
const dims = MAPPABLE_TAGS.filter((d) => dimRanked[d]?.length > 0);
|
|
236
|
+
if (!dims.length)
|
|
237
|
+
return [];
|
|
238
|
+
const score = (tags) => {
|
|
239
|
+
let s = 0;
|
|
240
|
+
for (const d of dims) {
|
|
241
|
+
const w = weights[d] ?? 0.01;
|
|
242
|
+
const entry = dimRanked[d].find((e) => e.value === tags[d]);
|
|
243
|
+
if (entry)
|
|
244
|
+
s += w * entry.avg;
|
|
245
|
+
}
|
|
246
|
+
return s;
|
|
247
|
+
};
|
|
248
|
+
const key = (tags) => dims.map((d) => tags[d] ?? '').join('|');
|
|
249
|
+
const seen = new Set();
|
|
250
|
+
const heap = [];
|
|
251
|
+
const results = [];
|
|
252
|
+
const best = {};
|
|
253
|
+
for (const d of dims)
|
|
254
|
+
best[d] = dimRanked[d][0].value;
|
|
255
|
+
const bestKey = key(best);
|
|
256
|
+
seen.add(bestKey);
|
|
257
|
+
heap.push({ tags: best, score: score(best) });
|
|
258
|
+
while (results.length < topK && heap.length > 0) {
|
|
259
|
+
heap.sort((a, b) => (higherIsBetter ? b.score - a.score : a.score - b.score));
|
|
260
|
+
const top = heap.shift();
|
|
261
|
+
results.push({
|
|
262
|
+
tags: top.tags,
|
|
263
|
+
score: top.score,
|
|
264
|
+
perDim: dims.map((d) => ({
|
|
265
|
+
dim: d,
|
|
266
|
+
value: top.tags[d],
|
|
267
|
+
metricAvg: dimRanked[d].find((e) => e.value === top.tags[d])?.avg ?? 0,
|
|
268
|
+
omega2: weights[d] ?? 0,
|
|
269
|
+
})),
|
|
270
|
+
});
|
|
271
|
+
for (const d of dims) {
|
|
272
|
+
const curIdx = dimRanked[d].findIndex((e) => e.value === top.tags[d]);
|
|
273
|
+
if (curIdx >= 0 && curIdx < dimRanked[d].length - 1) {
|
|
274
|
+
const next = { ...top.tags, [d]: dimRanked[d][curIdx + 1].value };
|
|
275
|
+
const k = key(next);
|
|
276
|
+
if (!seen.has(k)) {
|
|
277
|
+
seen.add(k);
|
|
278
|
+
heap.push({ tags: next, score: score(next) });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return results;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=algorithms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../src/recommend/algorithms.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend HTTP API 的 Request / Response 协议定义。
|
|
3
|
+
*
|
|
4
|
+
* 同一组接口同时挂在两个路径前缀上(实现见 backend RecommendModule):
|
|
5
|
+
* - /api/recommend/* (UI 用,session 鉴权)
|
|
6
|
+
* - /api/agent/tools/recommend-* (CLI/Agent 用,sandbox token 鉴权)
|
|
7
|
+
*
|
|
8
|
+
* 两套路径共享本文件定义的 DTO,以保证前后端 + CLI 三方协议一致。
|
|
9
|
+
*/
|
|
10
|
+
import type { AtomSlot, Channel, Creative, ImprovementSuggestion, KnnResult, MappingRule, Metric, OptimalCombination, RecommendData, SimilarCreativeItem, TagDimension } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* 返回完整推荐数据快照。前端首屏一次性拉取,本地内存缓存。
|
|
13
|
+
*
|
|
14
|
+
* 响应结构与 RecommendData 完全一致,加 `version` 便于前端判断是否需要刷新。
|
|
15
|
+
*/
|
|
16
|
+
export type GetRecommendDataResponse = RecommendData & {
|
|
17
|
+
/** 数据版本号,目前为 backend 启动时计算的 hash;数据不变时保持稳定 */
|
|
18
|
+
version: string;
|
|
19
|
+
};
|
|
20
|
+
export type SimilarRequest = {
|
|
21
|
+
channel: Channel;
|
|
22
|
+
metric: Metric;
|
|
23
|
+
/** 二选一:从 creativeId 取 tags,或直接传 tags */
|
|
24
|
+
creativeId?: string;
|
|
25
|
+
tags?: Record<string, string | null>;
|
|
26
|
+
/** Top-N 相似 Creative,默认 5 */
|
|
27
|
+
topN?: number;
|
|
28
|
+
/** KNN 的 k,默认 5 */
|
|
29
|
+
k?: number;
|
|
30
|
+
/** 是否返回 KNN 预估,默认 true */
|
|
31
|
+
includeKnn?: boolean;
|
|
32
|
+
/** 是否对每个相似项算 atoms,默认 false (省 payload) */
|
|
33
|
+
includeAtoms?: boolean;
|
|
34
|
+
};
|
|
35
|
+
export type SimilarResponseItem = SimilarCreativeItem & {
|
|
36
|
+
atoms?: Record<string, string | number>;
|
|
37
|
+
};
|
|
38
|
+
export type SimilarResponse = {
|
|
39
|
+
similar: SimilarResponseItem[];
|
|
40
|
+
knn: KnnResult | null;
|
|
41
|
+
};
|
|
42
|
+
export type ImprovementsRequest = {
|
|
43
|
+
channel: Channel;
|
|
44
|
+
metric: Metric;
|
|
45
|
+
/** 必填:被分析的素材 id */
|
|
46
|
+
r1Id: string;
|
|
47
|
+
/** 可选:对照标杆素材 id;提供时响应里加 `tagDiffs` 字段 */
|
|
48
|
+
r2Id?: string;
|
|
49
|
+
};
|
|
50
|
+
export type TagDiffEntry = {
|
|
51
|
+
dim: string;
|
|
52
|
+
from: string | null;
|
|
53
|
+
to: string | null;
|
|
54
|
+
changed: boolean;
|
|
55
|
+
};
|
|
56
|
+
export type ImprovementsResponse = {
|
|
57
|
+
r1: Creative;
|
|
58
|
+
r2: Creative | null;
|
|
59
|
+
/** 仅当 r2Id 提供时返回 */
|
|
60
|
+
tagDiffs: TagDiffEntry[] | null;
|
|
61
|
+
/** R1 的逐维改进建议(从 dimValueStats 推导,与 r2 无关) */
|
|
62
|
+
improvements: ImprovementSuggestion[];
|
|
63
|
+
};
|
|
64
|
+
export type RandomRequest = {
|
|
65
|
+
channel: Channel;
|
|
66
|
+
metric: Metric;
|
|
67
|
+
/** 批量数量,默认 10,上限 100 */
|
|
68
|
+
batchSize?: number;
|
|
69
|
+
/** 每条结果附带的相似 Creative 数量,默认 5 */
|
|
70
|
+
similarTopN?: number;
|
|
71
|
+
/** 是否对每条结果算 atoms,默认 true */
|
|
72
|
+
includeAtoms?: boolean;
|
|
73
|
+
/** 随机种子(可选);提供时结果可复现 */
|
|
74
|
+
seed?: number;
|
|
75
|
+
};
|
|
76
|
+
export type RandomComboItem = {
|
|
77
|
+
tags: Record<string, string | null>;
|
|
78
|
+
atoms?: Record<string, string | number>;
|
|
79
|
+
knn: KnnResult | null;
|
|
80
|
+
similar: SimilarCreativeItem[];
|
|
81
|
+
};
|
|
82
|
+
export type RandomResponse = {
|
|
83
|
+
/** 已按预估指标排序(higherIsBetter=true 时降序) */
|
|
84
|
+
combos: RandomComboItem[];
|
|
85
|
+
};
|
|
86
|
+
export type OptimalRequest = {
|
|
87
|
+
channel: Channel;
|
|
88
|
+
metric: Metric;
|
|
89
|
+
/** Top-K 理论最优组合,默认 5 */
|
|
90
|
+
topK?: number;
|
|
91
|
+
/** 是否对每条结果附带 atoms 配置(避免前端逐条往返调 tag-to-atom),默认 false */
|
|
92
|
+
includeAtoms?: boolean;
|
|
93
|
+
};
|
|
94
|
+
export type OptimalCombinationItem = OptimalCombination & {
|
|
95
|
+
atoms?: Record<string, string | number>;
|
|
96
|
+
};
|
|
97
|
+
export type OptimalResponse = {
|
|
98
|
+
optimal: OptimalCombinationItem[];
|
|
99
|
+
};
|
|
100
|
+
export type TagToAtomRequest = {
|
|
101
|
+
tags: Record<string, string | null>;
|
|
102
|
+
};
|
|
103
|
+
export type TagToAtomResponse = {
|
|
104
|
+
atoms: Record<string, string | number>;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* 列出当前数据快照里包含的渠道 / 指标 / 标签维度,
|
|
108
|
+
* 便于 CLI 在不下载完整数据时也能做参数补全。
|
|
109
|
+
*/
|
|
110
|
+
export type RecommendMetaResponse = {
|
|
111
|
+
version: string;
|
|
112
|
+
channels: Channel[];
|
|
113
|
+
metrics: Metric[];
|
|
114
|
+
tagDimensions: TagDimension[];
|
|
115
|
+
atomSlots: AtomSlot[];
|
|
116
|
+
mappingRules: MappingRule[];
|
|
117
|
+
creativeCount: number;
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=api-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-types.d.ts","sourceRoot":"","sources":["../../src/recommend/api-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend HTTP API 的 Request / Response 协议定义。
|
|
3
|
+
*
|
|
4
|
+
* 同一组接口同时挂在两个路径前缀上(实现见 backend RecommendModule):
|
|
5
|
+
* - /api/recommend/* (UI 用,session 鉴权)
|
|
6
|
+
* - /api/agent/tools/recommend-* (CLI/Agent 用,sandbox token 鉴权)
|
|
7
|
+
*
|
|
8
|
+
* 两套路径共享本文件定义的 DTO,以保证前后端 + CLI 三方协议一致。
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=api-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-types.js","sourceRoot":"","sources":["../../src/recommend/api-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recommend/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recommend/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend 模块共享数据 schema。
|
|
3
|
+
*
|
|
4
|
+
* 本文件由 packages/frontend/src/lib/recommend/types.ts 整体迁移而来,
|
|
5
|
+
* 作为前端 / 后端 / CLI 三方共享的唯一定义来源。
|
|
6
|
+
*
|
|
7
|
+
* 任何字段调整必须同步评审三个调用方:
|
|
8
|
+
* - packages/backend/src/features/recommend/*
|
|
9
|
+
* - packages/frontend/src/app/(dashboard)/recommend/*
|
|
10
|
+
* - packages/cli/src/commands/recommend.ts
|
|
11
|
+
*/
|
|
12
|
+
export type AtomSlot = {
|
|
13
|
+
id: string;
|
|
14
|
+
label: {
|
|
15
|
+
zh: string;
|
|
16
|
+
en: string;
|
|
17
|
+
};
|
|
18
|
+
kind: 'fixed' | 'parametric' | 'generative';
|
|
19
|
+
options?: string[];
|
|
20
|
+
range?: {
|
|
21
|
+
min: number;
|
|
22
|
+
max: number;
|
|
23
|
+
step: number;
|
|
24
|
+
};
|
|
25
|
+
assetKind?: string;
|
|
26
|
+
constraints?: {
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type TagValue = {
|
|
32
|
+
id: string;
|
|
33
|
+
label: {
|
|
34
|
+
zh: string;
|
|
35
|
+
en: string;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type TagDimension = {
|
|
39
|
+
id: string;
|
|
40
|
+
label: {
|
|
41
|
+
zh: string;
|
|
42
|
+
en: string;
|
|
43
|
+
};
|
|
44
|
+
cardinality: string;
|
|
45
|
+
mappable: boolean;
|
|
46
|
+
values: TagValue[];
|
|
47
|
+
};
|
|
48
|
+
export type MappingRule = {
|
|
49
|
+
id: string;
|
|
50
|
+
slot: string;
|
|
51
|
+
when: string;
|
|
52
|
+
mapping?: {
|
|
53
|
+
dimension: string;
|
|
54
|
+
passthrough: boolean;
|
|
55
|
+
};
|
|
56
|
+
containsAny?: {
|
|
57
|
+
tokens: string[];
|
|
58
|
+
tag: {
|
|
59
|
+
dimension: string;
|
|
60
|
+
value: string;
|
|
61
|
+
};
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
export type Creative = {
|
|
65
|
+
id: string;
|
|
66
|
+
ctr: number;
|
|
67
|
+
cvr: number;
|
|
68
|
+
cpi: number;
|
|
69
|
+
ipm: number;
|
|
70
|
+
cost: number;
|
|
71
|
+
installs: number;
|
|
72
|
+
impressions: number;
|
|
73
|
+
clicks: number;
|
|
74
|
+
tags: Record<string, string | null>;
|
|
75
|
+
};
|
|
76
|
+
export type DimValueStat = {
|
|
77
|
+
count: number;
|
|
78
|
+
avgCtr: number;
|
|
79
|
+
avgCvr: number;
|
|
80
|
+
avgCpi: number;
|
|
81
|
+
avgIpm: number;
|
|
82
|
+
avgCost: number;
|
|
83
|
+
avgInstalls: number;
|
|
84
|
+
};
|
|
85
|
+
export type ChannelStats = {
|
|
86
|
+
count: number;
|
|
87
|
+
avgCtr: number;
|
|
88
|
+
medianCtr: number;
|
|
89
|
+
avgCvr: number;
|
|
90
|
+
avgCpi: number;
|
|
91
|
+
avgIpm: number;
|
|
92
|
+
avgCost: number;
|
|
93
|
+
avgInstalls: number;
|
|
94
|
+
};
|
|
95
|
+
export type RecommendData = {
|
|
96
|
+
atomSlots: AtomSlot[];
|
|
97
|
+
tagDimensions: TagDimension[];
|
|
98
|
+
mappingRules: MappingRule[];
|
|
99
|
+
creatives: Creative[];
|
|
100
|
+
channelWeights: Record<string, Record<string, Record<string, number>>>;
|
|
101
|
+
channelStats: Record<string, ChannelStats>;
|
|
102
|
+
dimValueStats: Record<string, Record<string, Record<string, DimValueStat>>>;
|
|
103
|
+
};
|
|
104
|
+
export declare const MAPPABLE_TAGS: readonly ["玩法类型", "布局造型", "包装方式", "背景场景", "情感元素", "计分方式", "限时机制", "牌面风格"];
|
|
105
|
+
export type MappableTag = (typeof MAPPABLE_TAGS)[number];
|
|
106
|
+
export declare const CHANNELS: readonly ["Applovin", "Facebook", "Google", "Moloco", "Unity"];
|
|
107
|
+
export type Channel = (typeof CHANNELS)[number];
|
|
108
|
+
export declare const METRICS: readonly ["ctr", "cvr", "cpi", "ipm", "cost", "installs"];
|
|
109
|
+
export type Metric = (typeof METRICS)[number];
|
|
110
|
+
export declare const METRIC_CONFIG: Record<Metric, {
|
|
111
|
+
label: string;
|
|
112
|
+
unit: string;
|
|
113
|
+
higherIsBetter: boolean;
|
|
114
|
+
field: keyof Creative;
|
|
115
|
+
statField: keyof DimValueStat;
|
|
116
|
+
}>;
|
|
117
|
+
export declare function formatMetricValue(value: number | undefined | null, metric: Metric): string;
|
|
118
|
+
export type KnnResult = {
|
|
119
|
+
predicted: number;
|
|
120
|
+
neighbors: {
|
|
121
|
+
creative: Creative;
|
|
122
|
+
distance: number;
|
|
123
|
+
}[];
|
|
124
|
+
rank: number;
|
|
125
|
+
};
|
|
126
|
+
export type ImprovementSuggestion = {
|
|
127
|
+
dimension: MappableTag;
|
|
128
|
+
currentValue: string | null;
|
|
129
|
+
suggestedValue: string;
|
|
130
|
+
omega2: number;
|
|
131
|
+
currentAvg: number;
|
|
132
|
+
suggestedAvg: number;
|
|
133
|
+
delta: number;
|
|
134
|
+
sampleSize: {
|
|
135
|
+
from: number;
|
|
136
|
+
to: number;
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
export type SimilarCreativeItem = {
|
|
140
|
+
creative: Creative;
|
|
141
|
+
distance: number;
|
|
142
|
+
matchingDims: string[];
|
|
143
|
+
};
|
|
144
|
+
export type OptimalCombination = {
|
|
145
|
+
tags: Record<string, string>;
|
|
146
|
+
score: number;
|
|
147
|
+
perDim: {
|
|
148
|
+
dim: string;
|
|
149
|
+
value: string;
|
|
150
|
+
metricAvg: number;
|
|
151
|
+
omega2: number;
|
|
152
|
+
}[];
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/recommend/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recommend 模块共享数据 schema。
|
|
3
|
+
*
|
|
4
|
+
* 本文件由 packages/frontend/src/lib/recommend/types.ts 整体迁移而来,
|
|
5
|
+
* 作为前端 / 后端 / CLI 三方共享的唯一定义来源。
|
|
6
|
+
*
|
|
7
|
+
* 任何字段调整必须同步评审三个调用方:
|
|
8
|
+
* - packages/backend/src/features/recommend/*
|
|
9
|
+
* - packages/frontend/src/app/(dashboard)/recommend/*
|
|
10
|
+
* - packages/cli/src/commands/recommend.ts
|
|
11
|
+
*/
|
|
12
|
+
export const MAPPABLE_TAGS = [
|
|
13
|
+
'玩法类型',
|
|
14
|
+
'布局造型',
|
|
15
|
+
'包装方式',
|
|
16
|
+
'背景场景',
|
|
17
|
+
'情感元素',
|
|
18
|
+
'计分方式',
|
|
19
|
+
'限时机制',
|
|
20
|
+
'牌面风格',
|
|
21
|
+
];
|
|
22
|
+
export const CHANNELS = ['Applovin', 'Facebook', 'Google', 'Moloco', 'Unity'];
|
|
23
|
+
export const METRICS = ['ctr', 'cvr', 'cpi', 'ipm', 'cost', 'installs'];
|
|
24
|
+
export const METRIC_CONFIG = {
|
|
25
|
+
ctr: { label: 'CTR', unit: '%', higherIsBetter: true, field: 'ctr', statField: 'avgCtr' },
|
|
26
|
+
cvr: { label: 'CVR', unit: '%', higherIsBetter: true, field: 'cvr', statField: 'avgCvr' },
|
|
27
|
+
cpi: { label: 'CPI', unit: '$', higherIsBetter: false, field: 'cpi', statField: 'avgCpi' },
|
|
28
|
+
ipm: { label: 'IPM', unit: '', higherIsBetter: true, field: 'ipm', statField: 'avgIpm' },
|
|
29
|
+
cost: { label: 'Cost', unit: '$', higherIsBetter: false, field: 'cost', statField: 'avgCost' },
|
|
30
|
+
installs: { label: 'Installs', unit: '', higherIsBetter: true, field: 'installs', statField: 'avgInstalls' },
|
|
31
|
+
};
|
|
32
|
+
export function formatMetricValue(value, metric) {
|
|
33
|
+
const v = value ?? 0;
|
|
34
|
+
const cfg = METRIC_CONFIG[metric];
|
|
35
|
+
if (cfg.unit === '$')
|
|
36
|
+
return `$${v.toFixed(2)}`;
|
|
37
|
+
if (cfg.unit === '%')
|
|
38
|
+
return `${v.toFixed(1)}%`;
|
|
39
|
+
if (Math.abs(v) >= 1000)
|
|
40
|
+
return `${(v / 1000).toFixed(1)}k`;
|
|
41
|
+
return v.toFixed(1);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/recommend/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6EH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACE,CAAC;AAGX,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAGvF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAGjF,MAAM,CAAC,MAAM,aAAa,GAStB;IACF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACzF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACzF,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC1F,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACxF,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE;IAC9F,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE;CAC7G,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,KAAgC,EAAE,MAAc;IAChF,MAAM,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;IACrB,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@playcraft/common",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -64,6 +64,10 @@
|
|
|
64
64
|
"./search": {
|
|
65
65
|
"types": "./dist/search/index.d.ts",
|
|
66
66
|
"default": "./dist/search/index.js"
|
|
67
|
+
},
|
|
68
|
+
"./recommend": {
|
|
69
|
+
"types": "./dist/recommend/index.d.ts",
|
|
70
|
+
"default": "./dist/recommend/index.js"
|
|
67
71
|
}
|
|
68
72
|
},
|
|
69
73
|
"files": [
|