@ray-js/t-agent-plugin-aistream 0.2.0-beta-14 → 0.2.0-beta-16
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/AIStreamTypes.d.ts +31 -17
- package/dist/AIStreamTypes.js +5 -0
- package/dist/buildIn/withBuildIn.js +40 -2
- package/dist/utils/AIStream.d.ts +1 -1
- package/dist/utils/AIStream.js +14 -3
- package/dist/utils/defaultMock.js +2 -2
- package/dist/utils/sendMessage.js +7 -16
- package/dist/withAIStream.js +9 -10
- package/package.json +2 -2
package/dist/AIStreamTypes.d.ts
CHANGED
|
@@ -1434,24 +1434,38 @@ export type ReceivedTextNlgPacket = ReceivedTextPacketBase<ReceivedTextPacketTyp
|
|
|
1434
1434
|
finish: boolean;
|
|
1435
1435
|
}>;
|
|
1436
1436
|
export declare enum BuildInSkillCode {
|
|
1437
|
-
SEARCH_KNOWLEDGE = "searchKnowledge"
|
|
1437
|
+
SEARCH_KNOWLEDGE = "searchKnowledge",
|
|
1438
|
+
SMART_HOME = "smart_home"
|
|
1438
1439
|
}
|
|
1439
|
-
export type ReceivedTextSkillPacketBody<
|
|
1440
|
-
code:
|
|
1441
|
-
|
|
1442
|
-
|
|
1440
|
+
export type ReceivedTextSkillPacketBody<Code = BuildInSkillCode | string, G = any, C = any> = {
|
|
1441
|
+
code: Code;
|
|
1442
|
+
general?: G;
|
|
1443
|
+
custom?: C;
|
|
1443
1444
|
};
|
|
1444
|
-
export type ReceivedTextSkillPacket<
|
|
1445
|
+
export type ReceivedTextSkillPacket<Code = BuildInSkillCode | string, G = any, C = any> = ReceivedTextPacketBase<ReceivedTextPacketType.SKILL, ReceivedTextSkillPacketBody<Code, G, C>>;
|
|
1445
1446
|
export type ReceivedTextPacket = ReceivedTextAsrPacket | ReceivedTextNlgPacket | ReceivedTextSkillPacket;
|
|
1446
|
-
export type
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1447
|
+
export type ReceivedSearchKnowledgeSkill = ReceivedTextSkillPacketBody<BuildInSkillCode.SEARCH_KNOWLEDGE, any, {
|
|
1448
|
+
documents: Array<{
|
|
1449
|
+
libCode: string;
|
|
1450
|
+
itemId: string;
|
|
1451
|
+
itemType: 'KNOWLEDGE';
|
|
1452
|
+
title: string;
|
|
1453
|
+
url: string;
|
|
1454
|
+
contentBody: string;
|
|
1455
|
+
}>;
|
|
1456
|
+
}>;
|
|
1457
|
+
export interface ReceivedSmartHomeSkillDevice {
|
|
1458
|
+
devId: string;
|
|
1459
|
+
devIcon: string;
|
|
1460
|
+
dps: Record<string, string>;
|
|
1461
|
+
devName: string;
|
|
1462
|
+
}
|
|
1463
|
+
export declare enum ReceivedSmartHomeSkillAction {
|
|
1464
|
+
CONTROL_DEVICE = "control_device"
|
|
1465
|
+
}
|
|
1466
|
+
export type ReceivedSmartHomeSkill = ReceivedTextSkillPacketBody<BuildInSkillCode.SEARCH_KNOWLEDGE, {
|
|
1467
|
+
data: {
|
|
1468
|
+
devices: ReceivedSmartHomeSkillDevice[];
|
|
1456
1469
|
};
|
|
1457
|
-
|
|
1470
|
+
action: ReceivedSmartHomeSkillAction;
|
|
1471
|
+
}, any>;
|
package/dist/AIStreamTypes.js
CHANGED
|
@@ -217,5 +217,10 @@ export let ReceivedTextPacketEof = /*#__PURE__*/function (ReceivedTextPacketEof)
|
|
|
217
217
|
}({});
|
|
218
218
|
export let BuildInSkillCode = /*#__PURE__*/function (BuildInSkillCode) {
|
|
219
219
|
BuildInSkillCode["SEARCH_KNOWLEDGE"] = "searchKnowledge";
|
|
220
|
+
BuildInSkillCode["SMART_HOME"] = "smart_home";
|
|
220
221
|
return BuildInSkillCode;
|
|
222
|
+
}({});
|
|
223
|
+
export let ReceivedSmartHomeSkillAction = /*#__PURE__*/function (ReceivedSmartHomeSkillAction) {
|
|
224
|
+
ReceivedSmartHomeSkillAction["CONTROL_DEVICE"] = "control_device";
|
|
225
|
+
return ReceivedSmartHomeSkillAction;
|
|
221
226
|
}({});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import "core-js/modules/web.dom-collections.iterator.js";
|
|
2
2
|
import { getMiniAppConfig } from '../utils';
|
|
3
3
|
import logger from '../utils/logger';
|
|
4
|
-
import { BuildInSkillCode } from '../AIStreamTypes';
|
|
4
|
+
import { BuildInSkillCode, ReceivedSmartHomeSkillAction } from '../AIStreamTypes';
|
|
5
5
|
export function withBuildIn() {
|
|
6
6
|
return _agent => {
|
|
7
7
|
if (!_agent.plugins.aiStream || !_agent.plugins.ui) {
|
|
@@ -54,7 +54,7 @@ export function withBuildIn() {
|
|
|
54
54
|
if (skill.code !== BuildInSkillCode.SEARCH_KNOWLEDGE) {
|
|
55
55
|
continue;
|
|
56
56
|
}
|
|
57
|
-
const content = skill
|
|
57
|
+
const content = skill;
|
|
58
58
|
if (!((_content$custom = content.custom) !== null && _content$custom !== void 0 && _content$custom.documents)) {
|
|
59
59
|
continue;
|
|
60
60
|
}
|
|
@@ -70,6 +70,44 @@ export function withBuildIn() {
|
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
})();
|
|
73
|
+
(() => {
|
|
74
|
+
const intentMap = {
|
|
75
|
+
[ReceivedSmartHomeSkillAction.CONTROL_DEVICE]: 'controlDevice'
|
|
76
|
+
};
|
|
77
|
+
onSkillsEnd((skills, responseMessage) => {
|
|
78
|
+
if (!responseMessage) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const data = {
|
|
82
|
+
deviceInfo: [],
|
|
83
|
+
sceneInfo: [],
|
|
84
|
+
changeInfo: []
|
|
85
|
+
};
|
|
86
|
+
for (const skill of skills) {
|
|
87
|
+
var _content$general;
|
|
88
|
+
if (skill.code !== BuildInSkillCode.SMART_HOME) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const content = skill;
|
|
92
|
+
if (!(content !== null && content !== void 0 && (_content$general = content.general) !== null && _content$general !== void 0 && (_content$general = _content$general.data) !== null && _content$general !== void 0 && (_content$general = _content$general.devices) !== null && _content$general !== void 0 && _content$general.length)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const intent = intentMap[content.general.action] || 'controlDevice';
|
|
96
|
+
for (const dev of content.general.data.devices) {
|
|
97
|
+
data.deviceInfo.push({
|
|
98
|
+
icon: dev.devIcon,
|
|
99
|
+
name: dev.devName,
|
|
100
|
+
deviceId: dev.devId,
|
|
101
|
+
intent,
|
|
102
|
+
success: null
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (data.deviceInfo.length) {
|
|
107
|
+
responseMessage.bubble.addTile('operateCard', data);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
})();
|
|
73
111
|
return {};
|
|
74
112
|
};
|
|
75
113
|
}
|
package/dist/utils/AIStream.d.ts
CHANGED
|
@@ -120,7 +120,7 @@ export declare class AIStreamEvent {
|
|
|
120
120
|
}): Promise<void>;
|
|
121
121
|
abort(options?: {
|
|
122
122
|
userData?: Attribute[];
|
|
123
|
-
}):
|
|
123
|
+
}): void;
|
|
124
124
|
on(name: 'close', callback: () => void): void;
|
|
125
125
|
on(name: 'finish', callback: () => void): void;
|
|
126
126
|
on(name: 'error', callback: (error: any) => void): void;
|
package/dist/utils/AIStream.js
CHANGED
|
@@ -374,6 +374,7 @@ export class AIStreamEvent {
|
|
|
374
374
|
if (this.streams[dataChannel]) {
|
|
375
375
|
throw new AIStreamEventError("".concat(dataChannel, " stream already exists"), AIStreamErrorCode.AIStreamError);
|
|
376
376
|
}
|
|
377
|
+
let startPromise = null;
|
|
377
378
|
const stream = {
|
|
378
379
|
dataChannel,
|
|
379
380
|
type: source.type,
|
|
@@ -392,11 +393,12 @@ export class AIStreamEvent {
|
|
|
392
393
|
count: source.amplitudeCount
|
|
393
394
|
});
|
|
394
395
|
}
|
|
395
|
-
|
|
396
|
+
startPromise = startRecordAndSendAudioData({
|
|
396
397
|
sessionId: this.sessionId,
|
|
397
398
|
dataChannel,
|
|
398
399
|
userData: source.userData
|
|
399
400
|
});
|
|
401
|
+
await startPromise;
|
|
400
402
|
} else if (source.type === 'video') {
|
|
401
403
|
// const cameraType = source.cameraType || VideoCameraType.BACK;
|
|
402
404
|
// await startRecordAndSendVideoData({
|
|
@@ -410,13 +412,22 @@ export class AIStreamEvent {
|
|
|
410
412
|
if (!stream.started || this.closed) {
|
|
411
413
|
return;
|
|
412
414
|
}
|
|
415
|
+
// 一定要等录音开始,才能结束
|
|
416
|
+
if (startPromise) {
|
|
417
|
+
try {
|
|
418
|
+
await startPromise;
|
|
419
|
+
} catch (e) {
|
|
420
|
+
// pass
|
|
421
|
+
}
|
|
422
|
+
startPromise = null;
|
|
423
|
+
}
|
|
413
424
|
if (source.type === 'audio') {
|
|
414
425
|
if (source.amplitudeCount) {
|
|
415
426
|
unregisterVoiceAmplitudes({
|
|
416
427
|
count: source.amplitudeCount
|
|
417
428
|
});
|
|
418
429
|
}
|
|
419
|
-
|
|
430
|
+
stopRecordAndSendAudioData({
|
|
420
431
|
sessionId: this.sessionId,
|
|
421
432
|
dataChannel,
|
|
422
433
|
userData: source.userData
|
|
@@ -452,7 +463,7 @@ export class AIStreamEvent {
|
|
|
452
463
|
userData: options === null || options === void 0 ? void 0 : options.userData
|
|
453
464
|
});
|
|
454
465
|
}
|
|
455
|
-
|
|
466
|
+
abort(options) {
|
|
456
467
|
if (this.closed) {
|
|
457
468
|
return;
|
|
458
469
|
}
|
|
@@ -124,7 +124,7 @@ mock.hooks.hook('createSession', context => {
|
|
|
124
124
|
// 用于测试断开连接;
|
|
125
125
|
// setTimeout(() => {
|
|
126
126
|
// dispatch('onConnectStateChanged', {
|
|
127
|
-
// connectionId:
|
|
127
|
+
// connectionId: '',
|
|
128
128
|
// connectState: ConnectState.DISCONNECTED,
|
|
129
129
|
// code: 200,
|
|
130
130
|
// });
|
|
@@ -134,7 +134,7 @@ mock.hooks.hook('createSession', context => {
|
|
|
134
134
|
// s.closed = true;
|
|
135
135
|
// });
|
|
136
136
|
// mock.data.set('sessionMap', new Map());
|
|
137
|
-
// },
|
|
137
|
+
// }, 5000);
|
|
138
138
|
|
|
139
139
|
// 用于测试断开会话
|
|
140
140
|
// setTimeout(() => {
|
|
@@ -60,14 +60,14 @@ export function sendBlocksToAIStream(params) {
|
|
|
60
60
|
controller.enqueue(part);
|
|
61
61
|
};
|
|
62
62
|
let aborting = false;
|
|
63
|
-
const abort =
|
|
63
|
+
const abort = () => {
|
|
64
64
|
if (aborting || canceled || closed) {
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
67
|
aborting = true;
|
|
68
68
|
canceled = true;
|
|
69
69
|
if (event) {
|
|
70
|
-
|
|
70
|
+
event.abort();
|
|
71
71
|
}
|
|
72
72
|
aborting = false;
|
|
73
73
|
};
|
|
@@ -80,15 +80,6 @@ export function sendBlocksToAIStream(params) {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
};
|
|
83
|
-
|
|
84
|
-
// signal?.addEventListener('abort', async () => {
|
|
85
|
-
// logger.debug('sendBlocksToAIStream signal aborted');
|
|
86
|
-
// abortPromise = abort();
|
|
87
|
-
// await abortPromise;
|
|
88
|
-
// logger.debug('sendBlocksToAIStream signal aborted done');
|
|
89
|
-
// close();
|
|
90
|
-
// });
|
|
91
|
-
|
|
92
83
|
let pendingCancel = false;
|
|
93
84
|
if (audioEmitter) {
|
|
94
85
|
audioEmitter.addEventListener('confirm', () => {
|
|
@@ -133,7 +124,7 @@ export function sendBlocksToAIStream(params) {
|
|
|
133
124
|
}
|
|
134
125
|
if (signal !== null && signal !== void 0 && signal.aborted || pendingCancel) {
|
|
135
126
|
logger.debug('sendBlocksToAIStream pendingCancel aborted');
|
|
136
|
-
|
|
127
|
+
abort();
|
|
137
128
|
close();
|
|
138
129
|
return;
|
|
139
130
|
}
|
|
@@ -330,21 +321,21 @@ export function sendBlocksToAIStream(params) {
|
|
|
330
321
|
await s.stop();
|
|
331
322
|
}
|
|
332
323
|
logger.debug('sendBlocksToAIStream audio cancel aborted');
|
|
333
|
-
|
|
324
|
+
abort();
|
|
334
325
|
resolve();
|
|
335
326
|
});
|
|
336
327
|
s.start();
|
|
337
328
|
});
|
|
338
329
|
if (signal !== null && signal !== void 0 && signal.aborted) {
|
|
339
330
|
logger.debug('sendBlocksToAIStream after audio aborted');
|
|
340
|
-
|
|
331
|
+
abort();
|
|
341
332
|
close();
|
|
342
333
|
return;
|
|
343
334
|
}
|
|
344
335
|
}
|
|
345
336
|
await event.end();
|
|
346
337
|
if (signal !== null && signal !== void 0 && signal.aborted) {
|
|
347
|
-
|
|
338
|
+
abort();
|
|
348
339
|
close();
|
|
349
340
|
}
|
|
350
341
|
},
|
|
@@ -353,7 +344,7 @@ export function sendBlocksToAIStream(params) {
|
|
|
353
344
|
var _event;
|
|
354
345
|
canceled = true;
|
|
355
346
|
logger.debug('sendBlocksToAIStream stream canceled', reason);
|
|
356
|
-
|
|
347
|
+
(_event = event) === null || _event === void 0 || _event.abort();
|
|
357
348
|
}
|
|
358
349
|
}
|
|
359
350
|
});
|
package/dist/withAIStream.js
CHANGED
|
@@ -235,6 +235,7 @@ export function withAIStream() {
|
|
|
235
235
|
let end = false;
|
|
236
236
|
audioPromise = new Promise((resolve, reject) => {
|
|
237
237
|
// 当确认发送时,展示 loading
|
|
238
|
+
let userMsgShow = false;
|
|
238
239
|
const onConfirm = async () => {
|
|
239
240
|
if (end) {
|
|
240
241
|
return;
|
|
@@ -243,6 +244,7 @@ export function withAIStream() {
|
|
|
243
244
|
status: ChatMessageStatus.START
|
|
244
245
|
});
|
|
245
246
|
userMsg.bubble.setStatus(BubbleTileStatus.NORMAL);
|
|
247
|
+
userMsgShow = true; // show 会延迟变更 isShow 状态,所以使用 userMsgShow
|
|
246
248
|
await userMsg.show();
|
|
247
249
|
audioEmitter.removeEventListener('confirm', onConfirm);
|
|
248
250
|
};
|
|
@@ -253,10 +255,8 @@ export function withAIStream() {
|
|
|
253
255
|
if (end) {
|
|
254
256
|
return;
|
|
255
257
|
}
|
|
256
|
-
if (!event.detail.text) {
|
|
257
|
-
|
|
258
|
-
await userMsg.remove();
|
|
259
|
-
}
|
|
258
|
+
if (!event.detail.text && userMsgShow) {
|
|
259
|
+
await userMsg.remove();
|
|
260
260
|
reject(new Error('No text found in audio event'));
|
|
261
261
|
return;
|
|
262
262
|
}
|
|
@@ -274,21 +274,20 @@ export function withAIStream() {
|
|
|
274
274
|
audioEmitter.addEventListener('finish', onFinished);
|
|
275
275
|
const onCancel = async () => {
|
|
276
276
|
end = true;
|
|
277
|
-
if (!response.started) {
|
|
278
|
-
|
|
279
|
-
await userMsg.remove();
|
|
280
|
-
}
|
|
277
|
+
if (!response.started && userMsgShow) {
|
|
278
|
+
await userMsg.remove();
|
|
281
279
|
}
|
|
282
280
|
audioEmitter.removeEventListener('cancel', onCancel);
|
|
283
281
|
reject(new Error('User cancel'));
|
|
284
282
|
};
|
|
285
283
|
audioEmitter.addEventListener('cancel', onCancel);
|
|
286
284
|
signal.addEventListener('abort', () => {
|
|
285
|
+
logger.log('withAIStream chat agent.chat audioEmitter onAbort');
|
|
287
286
|
audioEmitter.dispatchEvent(new EmitterEvent('cancel'));
|
|
288
287
|
});
|
|
289
288
|
const onError = async () => {
|
|
290
289
|
end = true;
|
|
291
|
-
if (
|
|
290
|
+
if (userMsgShow && userMsg.status !== ChatMessageStatus.FINISH) {
|
|
292
291
|
await userMsg.remove();
|
|
293
292
|
}
|
|
294
293
|
audioEmitter.removeEventListener('error', onError);
|
|
@@ -419,7 +418,7 @@ export function withAIStream() {
|
|
|
419
418
|
await hooks.callHook('onTTTAction', tile, result);
|
|
420
419
|
if (result.action) {
|
|
421
420
|
await runTTTAction(result.action, {
|
|
422
|
-
onSendSkills: async () => {
|
|
421
|
+
onSendSkills: async (block, options) => {
|
|
423
422
|
throw new Error('send skill not support');
|
|
424
423
|
},
|
|
425
424
|
onSendMessages: async (blocks, sendImmediately) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ray-js/t-agent-plugin-aistream",
|
|
3
|
-
"version": "0.2.0-beta-
|
|
3
|
+
"version": "0.2.0-beta-16",
|
|
4
4
|
"author": "Tuya.inc",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/url-parse": "^1.4.11"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "d9abc8e193dc1db6a7f9fca9ebeba2ff6462b713"
|
|
39
39
|
}
|