@ray-js/t-agent-plugin-aistream 0.2.1-beta.3 → 0.2.2-beta-2
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 +6 -7
- package/dist/ChatHistoryStore.d.ts +23 -2
- package/dist/ChatHistoryStore.js +191 -1
- package/dist/buildIn/withBuildIn.js +55 -45
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -2
- package/dist/utils/observer.d.ts +1 -5
- package/dist/utils/observer.js +14 -21
- package/dist/utils/sendMessage.js +3 -5
- package/dist/withAIStream.d.ts +11 -12
- package/dist/withAIStream.js +67 -48
- package/package.json +2 -2
- package/dist/ChatHistoryLocalStore.d.ts +0 -22
- package/dist/ChatHistoryLocalStore.js +0 -191
package/dist/AIStreamTypes.d.ts
CHANGED
|
@@ -1573,8 +1573,7 @@ export type ReceivedTextAsrPacket = ReceivedTextPacketBase<ReceivedTextPacketTyp
|
|
|
1573
1573
|
text: string;
|
|
1574
1574
|
}>;
|
|
1575
1575
|
export type ReceivedTextNlgPacket = ReceivedTextPacketBase<ReceivedTextPacketType.NLG, {
|
|
1576
|
-
|
|
1577
|
-
content?: string;
|
|
1576
|
+
content: string;
|
|
1578
1577
|
appendMode: 'append';
|
|
1579
1578
|
finish: boolean;
|
|
1580
1579
|
}>;
|
|
@@ -1602,17 +1601,17 @@ export type ReceivedSearchKnowledgeSkill = ReceivedTextSkillPacketBody<BuildInSk
|
|
|
1602
1601
|
};
|
|
1603
1602
|
}>;
|
|
1604
1603
|
export interface ReceivedSmartHomeSkillDevice {
|
|
1605
|
-
|
|
1606
|
-
|
|
1604
|
+
deviceId: string;
|
|
1605
|
+
icon: string;
|
|
1607
1606
|
dps?: Record<string, string>;
|
|
1608
|
-
|
|
1607
|
+
name: string;
|
|
1609
1608
|
room: string;
|
|
1610
1609
|
success: boolean;
|
|
1611
1610
|
}
|
|
1612
1611
|
export interface ReceivedSmartHomeSkillScene {
|
|
1613
1612
|
sceneId: string;
|
|
1614
|
-
|
|
1615
|
-
|
|
1613
|
+
name: string;
|
|
1614
|
+
icon: string;
|
|
1616
1615
|
type: number;
|
|
1617
1616
|
valid: boolean;
|
|
1618
1617
|
displayColor: string;
|
|
@@ -10,7 +10,7 @@ export interface StoredMessageObject {
|
|
|
10
10
|
homeId?: number;
|
|
11
11
|
indexId?: string;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
interface Pagination {
|
|
14
14
|
sort?: 'asc' | 'desc';
|
|
15
15
|
offset: number;
|
|
16
16
|
limit: number;
|
|
@@ -30,7 +30,7 @@ export interface ChatHistoryStore<Key = number> {
|
|
|
30
30
|
/** 查询消息 */
|
|
31
31
|
query(id: Key): Promise<StoredMessageObject>;
|
|
32
32
|
/** 批量查询 */
|
|
33
|
-
queryAll(pagination:
|
|
33
|
+
queryAll(pagination: Pagination): Promise<{
|
|
34
34
|
total: number;
|
|
35
35
|
records: StoredMessageObject[];
|
|
36
36
|
}>;
|
|
@@ -45,3 +45,24 @@ export interface ChatHistoryStore<Key = number> {
|
|
|
45
45
|
id: Key;
|
|
46
46
|
}>;
|
|
47
47
|
}
|
|
48
|
+
export declare class ChatHistoryLocalStore implements ChatHistoryStore {
|
|
49
|
+
/** 版本号,会作为内部索引的一部分 */
|
|
50
|
+
private readonly version;
|
|
51
|
+
private options;
|
|
52
|
+
constructor(options: ChatHistoryStoreOptions);
|
|
53
|
+
private itemToMessage;
|
|
54
|
+
private getRecordIndex;
|
|
55
|
+
private getQueryCondition;
|
|
56
|
+
query(id: number): Promise<StoredMessageObject | null>;
|
|
57
|
+
queryAll(pagination: Pagination): Promise<{
|
|
58
|
+
total: number;
|
|
59
|
+
records: StoredMessageObject[];
|
|
60
|
+
}>;
|
|
61
|
+
update(id: number, body: ChatMessageObject): Promise<void>;
|
|
62
|
+
remove(id: number): Promise<void>;
|
|
63
|
+
removeAll(ids?: number[]): Promise<void>;
|
|
64
|
+
insert(message: ChatMessageObject): Promise<{
|
|
65
|
+
id: number;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
package/dist/ChatHistoryStore.js
CHANGED
|
@@ -1 +1,191 @@
|
|
|
1
|
-
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
4
|
+
const _excluded = ["id"];
|
|
5
|
+
import "core-js/modules/es.array.sort.js";
|
|
6
|
+
import "core-js/modules/es.json.stringify.js";
|
|
7
|
+
import "core-js/modules/esnext.iterator.constructor.js";
|
|
8
|
+
import "core-js/modules/esnext.iterator.filter.js";
|
|
9
|
+
import "core-js/modules/esnext.iterator.map.js";
|
|
10
|
+
import { safeParseJSON } from '@ray-js/t-agent';
|
|
11
|
+
import { insertRecord, deleteRecordList, updateRecord, queryRecordList } from './utils';
|
|
12
|
+
import logger from './utils/logger';
|
|
13
|
+
export class ChatHistoryLocalStore {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
/** 版本号,会作为内部索引的一部分 */
|
|
16
|
+
_defineProperty(this, "version", 'v1');
|
|
17
|
+
if (!options.agentId) {
|
|
18
|
+
throw new Error('agentId is required');
|
|
19
|
+
}
|
|
20
|
+
if (!options.bizCode) {
|
|
21
|
+
throw new Error('indexId is required');
|
|
22
|
+
}
|
|
23
|
+
this.options = _objectSpread({
|
|
24
|
+
indexId: 'default',
|
|
25
|
+
homeId: 0
|
|
26
|
+
}, options);
|
|
27
|
+
}
|
|
28
|
+
itemToMessage(item) {
|
|
29
|
+
const messageInfo = safeParseJSON(item.data);
|
|
30
|
+
if (!messageInfo) {
|
|
31
|
+
logger.error('ChatHistoryLocalStore failed parse item: ', item);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
messageInfo.message.meta.id = item.id;
|
|
35
|
+
return {
|
|
36
|
+
id: item.id,
|
|
37
|
+
indexId: item.index2,
|
|
38
|
+
agentId: item.solutionCode,
|
|
39
|
+
deviceId: item.devId,
|
|
40
|
+
homeId: item.homeId,
|
|
41
|
+
createdAt: messageInfo.createdAt,
|
|
42
|
+
updatedAt: messageInfo.updatedAt,
|
|
43
|
+
message: messageInfo.message
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
getRecordIndex() {
|
|
47
|
+
return {
|
|
48
|
+
bizCode: this.options.bizCode,
|
|
49
|
+
solutionCode: this.options.agentId,
|
|
50
|
+
homeId: this.options.homeId,
|
|
51
|
+
index: "t-agent-".concat(this.version),
|
|
52
|
+
index2: this.options.indexId,
|
|
53
|
+
deviceId: this.options.deviceId
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
getQueryCondition() {
|
|
57
|
+
const indexes = this.getRecordIndex();
|
|
58
|
+
const params = {
|
|
59
|
+
bizCode: [indexes.bizCode],
|
|
60
|
+
solutionCode: [indexes.solutionCode],
|
|
61
|
+
homeId: [indexes.homeId],
|
|
62
|
+
index: [indexes.index],
|
|
63
|
+
index2: [indexes.index2]
|
|
64
|
+
};
|
|
65
|
+
if (indexes.deviceId) {
|
|
66
|
+
params.devId = [indexes.deviceId];
|
|
67
|
+
}
|
|
68
|
+
return params;
|
|
69
|
+
}
|
|
70
|
+
async query(id) {
|
|
71
|
+
if (typeof id !== 'number') {
|
|
72
|
+
logger.warn('ChatHistoryLocalStore query id is not number', {
|
|
73
|
+
id
|
|
74
|
+
});
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const queryCondition = _objectSpread(_objectSpread({}, this.getQueryCondition()), {}, {
|
|
78
|
+
id: [id],
|
|
79
|
+
offset: 0,
|
|
80
|
+
limit: 1,
|
|
81
|
+
sortType: 1
|
|
82
|
+
});
|
|
83
|
+
const {
|
|
84
|
+
records
|
|
85
|
+
} = await queryRecordList(queryCondition);
|
|
86
|
+
return records[0] ? this.itemToMessage(records[0]) : null;
|
|
87
|
+
}
|
|
88
|
+
async queryAll(pagination) {
|
|
89
|
+
const queryCondition = _objectSpread(_objectSpread({}, this.getQueryCondition()), {}, {
|
|
90
|
+
offset: 0,
|
|
91
|
+
sortType: 1
|
|
92
|
+
});
|
|
93
|
+
const {
|
|
94
|
+
offset,
|
|
95
|
+
limit
|
|
96
|
+
} = pagination || {};
|
|
97
|
+
if (offset) {
|
|
98
|
+
queryCondition.offset = offset;
|
|
99
|
+
}
|
|
100
|
+
if (limit) {
|
|
101
|
+
queryCondition.limit = limit;
|
|
102
|
+
}
|
|
103
|
+
queryCondition.sortType = pagination.sort === 'desc' ? 0 : 1;
|
|
104
|
+
try {
|
|
105
|
+
const result = await queryRecordList(queryCondition);
|
|
106
|
+
const list = result.records.map(this.itemToMessage).filter(item => !!item);
|
|
107
|
+
return {
|
|
108
|
+
total: result.total,
|
|
109
|
+
records: list
|
|
110
|
+
};
|
|
111
|
+
} catch (error) {
|
|
112
|
+
logger.error('ChatHistoryLocalStore queryRecordList error', error);
|
|
113
|
+
return {
|
|
114
|
+
total: 0,
|
|
115
|
+
records: []
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async update(id, body) {
|
|
120
|
+
if (typeof id !== 'number') {
|
|
121
|
+
throw new Error('query id is not number');
|
|
122
|
+
}
|
|
123
|
+
const stored = await this.query(id);
|
|
124
|
+
if (!stored) {
|
|
125
|
+
throw new Error("could not find message: ".concat(id));
|
|
126
|
+
}
|
|
127
|
+
const nowTime = Date.now();
|
|
128
|
+
const msgObject = {
|
|
129
|
+
message: body,
|
|
130
|
+
createdAt: stored.createdAt,
|
|
131
|
+
updatedAt: nowTime
|
|
132
|
+
};
|
|
133
|
+
stored.message.meta.updatedAt = nowTime;
|
|
134
|
+
return updateRecord({
|
|
135
|
+
id,
|
|
136
|
+
data: JSON.stringify(msgObject)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async remove(id) {
|
|
140
|
+
if (typeof id !== 'number') {
|
|
141
|
+
throw new Error('query id is not number');
|
|
142
|
+
}
|
|
143
|
+
const stored = await this.query(id);
|
|
144
|
+
if (!stored) {
|
|
145
|
+
logger.warn('ChatHistoryLocalStore not find by id', {
|
|
146
|
+
id
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
await deleteRecordList({
|
|
150
|
+
id: [id]
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async removeAll(ids) {
|
|
154
|
+
if (ids) {
|
|
155
|
+
if (!Array.isArray(ids)) {
|
|
156
|
+
throw new Error('ids is not array');
|
|
157
|
+
}
|
|
158
|
+
if (ids.length === 0) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
await deleteRecordList(_objectSpread({
|
|
162
|
+
id: ids
|
|
163
|
+
}, this.getQueryCondition()));
|
|
164
|
+
} else {
|
|
165
|
+
await deleteRecordList(this.getQueryCondition());
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async insert(message) {
|
|
169
|
+
const nowTime = Date.now();
|
|
170
|
+
|
|
171
|
+
// 先把 id 提取出来不存,id 始终是在数据库里自增的
|
|
172
|
+
const _message$meta = message.meta,
|
|
173
|
+
{
|
|
174
|
+
id
|
|
175
|
+
} = _message$meta,
|
|
176
|
+
meta = _objectWithoutProperties(_message$meta, _excluded);
|
|
177
|
+
const msgObject = {
|
|
178
|
+
message: _objectSpread(_objectSpread({}, message), {}, {
|
|
179
|
+
meta: _objectSpread(_objectSpread(_objectSpread({}, meta), this.options), {}, {
|
|
180
|
+
createdAt: nowTime,
|
|
181
|
+
updatedAt: nowTime
|
|
182
|
+
})
|
|
183
|
+
}),
|
|
184
|
+
createdAt: nowTime,
|
|
185
|
+
updatedAt: nowTime
|
|
186
|
+
};
|
|
187
|
+
return insertRecord(_objectSpread(_objectSpread({}, this.getRecordIndex()), {}, {
|
|
188
|
+
data: JSON.stringify(msgObject)
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -41,41 +41,18 @@ export function withBuildIn() {
|
|
|
41
41
|
|
|
42
42
|
// 关联文档
|
|
43
43
|
|
|
44
|
+
// 关联智能家居卡片
|
|
44
45
|
(() => {
|
|
45
46
|
onSkillsEnd((skills, responseMessage) => {
|
|
46
47
|
if (!responseMessage) {
|
|
47
48
|
return;
|
|
48
49
|
}
|
|
49
|
-
const
|
|
50
|
-
|
|
50
|
+
const operateData = {
|
|
51
|
+
deviceInfo: [],
|
|
52
|
+
sceneInfo: [],
|
|
53
|
+
changeInfo: []
|
|
51
54
|
};
|
|
52
|
-
|
|
53
|
-
var _content$custom;
|
|
54
|
-
if (skill.code !== BuildInSkillCode.SEARCH_KNOWLEDGE) {
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
const content = skill;
|
|
58
|
-
if (!((_content$custom = content.custom) !== null && _content$custom !== void 0 && (_content$custom = _content$custom.data) !== null && _content$custom !== void 0 && _content$custom.documents)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
for (const doc of content.custom.data.documents) {
|
|
62
|
-
data.documents.push({
|
|
63
|
-
title: doc.title,
|
|
64
|
-
url: doc.url
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (data.documents.length) {
|
|
69
|
-
responseMessage.bubble.addTile('documents', data);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
})();
|
|
73
|
-
(() => {
|
|
74
|
-
onSkillsEnd((skills, responseMessage) => {
|
|
75
|
-
if (!responseMessage) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const data = {
|
|
55
|
+
const executeData = {
|
|
79
56
|
deviceInfo: [],
|
|
80
57
|
sceneInfo: [],
|
|
81
58
|
changeInfo: []
|
|
@@ -87,11 +64,11 @@ export function withBuildIn() {
|
|
|
87
64
|
const content = skill;
|
|
88
65
|
if (content.general.action === ReceivedSmartHomeSkillAction.QUERY_SCENE) {
|
|
89
66
|
for (const scene of content.general.data.scenes) {
|
|
90
|
-
|
|
67
|
+
executeData.sceneInfo.push({
|
|
91
68
|
type: scene.type,
|
|
92
69
|
enabled: scene.enable,
|
|
93
|
-
icon: scene.
|
|
94
|
-
name: scene.
|
|
70
|
+
icon: scene.icon,
|
|
71
|
+
name: scene.name,
|
|
95
72
|
sceneId: scene.sceneId,
|
|
96
73
|
intent: 'queryScene',
|
|
97
74
|
valid: scene.valid,
|
|
@@ -101,10 +78,10 @@ export function withBuildIn() {
|
|
|
101
78
|
}
|
|
102
79
|
} else if (content.general.action === ReceivedSmartHomeSkillAction.CONTROL_SCENE) {
|
|
103
80
|
for (const scene of content.general.data.scenes) {
|
|
104
|
-
|
|
81
|
+
operateData.sceneInfo.push({
|
|
105
82
|
type: scene.type,
|
|
106
|
-
icon: scene.
|
|
107
|
-
name: scene.
|
|
83
|
+
icon: scene.icon,
|
|
84
|
+
name: scene.name,
|
|
108
85
|
sceneId: scene.sceneId,
|
|
109
86
|
intent: 'controlScene',
|
|
110
87
|
valid: scene.valid,
|
|
@@ -114,10 +91,10 @@ export function withBuildIn() {
|
|
|
114
91
|
}
|
|
115
92
|
} else if (content.general.action === ReceivedSmartHomeSkillAction.QUERY_DEVICE) {
|
|
116
93
|
for (const dev of content.general.data.devices) {
|
|
117
|
-
|
|
118
|
-
icon: dev.
|
|
119
|
-
name: dev.
|
|
120
|
-
deviceId: dev.
|
|
94
|
+
executeData.deviceInfo.push({
|
|
95
|
+
icon: dev.icon,
|
|
96
|
+
name: dev.name,
|
|
97
|
+
deviceId: dev.deviceId,
|
|
121
98
|
intent: 'queryDevice',
|
|
122
99
|
room: dev.room,
|
|
123
100
|
success: dev.success
|
|
@@ -125,18 +102,51 @@ export function withBuildIn() {
|
|
|
125
102
|
}
|
|
126
103
|
} else if (content.general.action === ReceivedSmartHomeSkillAction.CONTROL_DEVICE) {
|
|
127
104
|
for (const dev of content.general.data.devices) {
|
|
128
|
-
|
|
129
|
-
icon: dev.
|
|
130
|
-
name: dev.
|
|
131
|
-
deviceId: dev.
|
|
105
|
+
operateData.deviceInfo.push({
|
|
106
|
+
icon: dev.icon,
|
|
107
|
+
name: dev.name,
|
|
108
|
+
deviceId: dev.deviceId,
|
|
132
109
|
intent: 'controlDevice',
|
|
133
110
|
success: null
|
|
134
111
|
});
|
|
135
112
|
}
|
|
136
113
|
}
|
|
137
114
|
}
|
|
138
|
-
if (
|
|
139
|
-
responseMessage.bubble.addTile('
|
|
115
|
+
if (executeData.deviceInfo.length || executeData.sceneInfo.length || executeData.changeInfo.length) {
|
|
116
|
+
responseMessage.bubble.addTile('executeCard', executeData);
|
|
117
|
+
}
|
|
118
|
+
if (operateData.deviceInfo.length || operateData.sceneInfo.length || operateData.changeInfo.length) {
|
|
119
|
+
responseMessage.bubble.addTile('operateCard', operateData);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
})();
|
|
123
|
+
// 最后是关联文档
|
|
124
|
+
(() => {
|
|
125
|
+
onSkillsEnd((skills, responseMessage) => {
|
|
126
|
+
if (!responseMessage) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const data = {
|
|
130
|
+
documents: []
|
|
131
|
+
};
|
|
132
|
+
for (const skill of skills) {
|
|
133
|
+
var _content$custom;
|
|
134
|
+
if (skill.code !== BuildInSkillCode.SEARCH_KNOWLEDGE) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const content = skill;
|
|
138
|
+
if (!((_content$custom = content.custom) !== null && _content$custom !== void 0 && (_content$custom = _content$custom.data) !== null && _content$custom !== void 0 && _content$custom.documents)) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
for (const doc of content.custom.data.documents) {
|
|
142
|
+
data.documents.push({
|
|
143
|
+
title: doc.title,
|
|
144
|
+
url: doc.url
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (data.documents.length) {
|
|
149
|
+
responseMessage.bubble.addTile('documents', data);
|
|
140
150
|
}
|
|
141
151
|
});
|
|
142
152
|
})();
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/utils/observer.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AudioBody, ConnectStateBody, EventBody, FileBody, ImageBody,
|
|
1
|
+
import { AudioBody, ConnectStateBody, EventBody, FileBody, ImageBody, SessionStateBody, TextBody, VideoBody } from '../AIStreamTypes';
|
|
2
2
|
export type AIStreamDataEntry = {
|
|
3
3
|
type: 'text';
|
|
4
4
|
body: TextBody;
|
|
@@ -23,9 +23,6 @@ export type AIStreamDataEntry = {
|
|
|
23
23
|
} | {
|
|
24
24
|
type: 'sessionState';
|
|
25
25
|
body: SessionStateBody;
|
|
26
|
-
} | {
|
|
27
|
-
type: 'amplitudes';
|
|
28
|
-
body: RecordAmplitudesBody;
|
|
29
26
|
};
|
|
30
27
|
export interface AIStreamObserverOptions {
|
|
31
28
|
sessionState?: boolean;
|
|
@@ -38,7 +35,6 @@ export interface AIStreamObserverOptions {
|
|
|
38
35
|
image?: boolean;
|
|
39
36
|
dataChannels?: string[];
|
|
40
37
|
sessionId?: string;
|
|
41
|
-
amplitudes?: boolean;
|
|
42
38
|
}
|
|
43
39
|
export declare class AIStreamObserverPool {
|
|
44
40
|
isStarted: boolean;
|
package/dist/utils/observer.js
CHANGED
|
@@ -3,9 +3,9 @@ import "core-js/modules/esnext.iterator.constructor.js";
|
|
|
3
3
|
import "core-js/modules/esnext.iterator.for-each.js";
|
|
4
4
|
import "core-js/modules/web.dom-collections.iterator.js";
|
|
5
5
|
import { ConnectState, EventType, SessionState, StreamFlag } from '../AIStreamTypes';
|
|
6
|
-
import { listenAudioReceived, listenConnectStateChanged, listenEventReceived, listenImageReceived,
|
|
6
|
+
import { listenAudioReceived, listenConnectStateChanged, listenEventReceived, listenImageReceived, listenSessionStateChanged, listenTextReceived } from './ttt';
|
|
7
7
|
import logger from './logger';
|
|
8
|
-
const types = ['connectionState', 'sessionState', 'event', 'text', 'audio', 'video', 'file', 'image'
|
|
8
|
+
const types = ['connectionState', 'sessionState', 'event', 'text', 'audio', 'video', 'file', 'image'];
|
|
9
9
|
export class AIStreamObserverPool {
|
|
10
10
|
constructor() {
|
|
11
11
|
_defineProperty(this, "isStarted", false);
|
|
@@ -18,8 +18,7 @@ export class AIStreamObserverPool {
|
|
|
18
18
|
audio: new Set(),
|
|
19
19
|
video: new Set(),
|
|
20
20
|
file: new Set(),
|
|
21
|
-
image: new Set()
|
|
22
|
-
amplitudes: new Set()
|
|
21
|
+
image: new Set()
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
24
|
start() {
|
|
@@ -27,21 +26,19 @@ export class AIStreamObserverPool {
|
|
|
27
26
|
return;
|
|
28
27
|
}
|
|
29
28
|
const handle = entry => {
|
|
29
|
+
var _entry$body;
|
|
30
30
|
const observers = this.observerMap[entry.type];
|
|
31
31
|
let state = '';
|
|
32
|
-
if (entry.type
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
} else if ((_entry$body = entry.body) !== null && _entry$body !== void 0 && _entry$body.streamFlag) {
|
|
41
|
-
state = "".concat(StreamFlag[entry.body.streamFlag]);
|
|
42
|
-
}
|
|
43
|
-
logger.debug("Pool received: %c".concat(observers.size ? '⊕' : '×').concat(entry.type, " ").concat(state), 'background: black; color: white', entry);
|
|
32
|
+
if (entry.type === 'connectionState') {
|
|
33
|
+
state = "".concat(ConnectState[entry.body.connectState], " ").concat(entry.body.code || '');
|
|
34
|
+
} else if (entry.type === 'sessionState') {
|
|
35
|
+
state = "".concat(SessionState[entry.body.sessionState], " ").concat(entry.body.code || '');
|
|
36
|
+
} else if (entry.type === 'event') {
|
|
37
|
+
state = "".concat(EventType[entry.body.eventType]);
|
|
38
|
+
} else if ((_entry$body = entry.body) !== null && _entry$body !== void 0 && _entry$body.streamFlag) {
|
|
39
|
+
state = "".concat(StreamFlag[entry.body.streamFlag]);
|
|
44
40
|
}
|
|
41
|
+
logger.debug("Pool received: %c".concat(observers.size ? '⊕' : '×').concat(entry.type, " ").concat(state), 'background: black; color: white', entry);
|
|
45
42
|
observers.forEach(observer => {
|
|
46
43
|
if (entry.type === 'text' || entry.type === 'audio' || entry.type === 'video' || entry.type === 'file' || entry.type === 'image') {
|
|
47
44
|
const {
|
|
@@ -81,9 +78,6 @@ export class AIStreamObserverPool {
|
|
|
81
78
|
})), listenImageReceived(body => handle({
|
|
82
79
|
type: 'image',
|
|
83
80
|
body
|
|
84
|
-
})), listenRecordAmplitudes(body => handle({
|
|
85
|
-
type: 'amplitudes',
|
|
86
|
-
body
|
|
87
81
|
}))
|
|
88
82
|
// listenVideoReceived(body => handle({ type: 'video', body })),
|
|
89
83
|
// listenFileReceived(body => handle({ type: 'file', body })),
|
|
@@ -102,8 +96,7 @@ export class AIStreamObserverPool {
|
|
|
102
96
|
audio: new Set(),
|
|
103
97
|
video: new Set(),
|
|
104
98
|
file: new Set(),
|
|
105
|
-
image: new Set()
|
|
106
|
-
amplitudes: new Set()
|
|
99
|
+
image: new Set()
|
|
107
100
|
};
|
|
108
101
|
}
|
|
109
102
|
connect(observer) {
|
|
@@ -144,13 +144,11 @@ export function sendBlocksToAIStream(params) {
|
|
|
144
144
|
}
|
|
145
145
|
const packet = safeParseJSON(data.body.text);
|
|
146
146
|
if (packet.bizType === ReceivedTextPacketType.NLG) {
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
logger.debug('sendBlocksToAIStream Receive NLG', delta);
|
|
150
|
-
const text = prevText + delta;
|
|
147
|
+
logger.debug('sendBlocksToAIStream Receive NLG', packet.data.content);
|
|
148
|
+
const text = prevText + packet.data.content;
|
|
151
149
|
enqueue({
|
|
152
150
|
type: 'text',
|
|
153
|
-
delta,
|
|
151
|
+
delta: packet.data.content,
|
|
154
152
|
text,
|
|
155
153
|
meta
|
|
156
154
|
});
|
package/dist/withAIStream.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { ChatAgent,
|
|
2
|
-
import { TTTAction } from './utils';
|
|
1
|
+
import { ChatAgent, ChatCardObject, ChatMessage, GetChatPluginHandler, InputBlock } from '@ray-js/t-agent';
|
|
3
2
|
import { ConnectClientType, ReceivedTextSkillPacketBody } from './AIStreamTypes';
|
|
4
|
-
import {
|
|
3
|
+
import { ChatHistoryLocalStore, StoredMessageObject } from './ChatHistoryStore';
|
|
5
4
|
export interface AIStreamOptions {
|
|
6
5
|
/** client 类型: 1-作为设备代理, 2-作为 App */
|
|
7
6
|
clientType?: ConnectClientType;
|
|
@@ -25,8 +24,8 @@ export interface AIStreamOptions {
|
|
|
25
24
|
homeId?: number;
|
|
26
25
|
/** 是否在 onAgentStart 阶段就建立连接 */
|
|
27
26
|
earlyStart?: boolean;
|
|
28
|
-
/** 自定义消息存储, 返回的实例需要实现
|
|
29
|
-
createChatHistoryStore?: (agent: ChatAgent) =>
|
|
27
|
+
/** 自定义消息存储, 返回的实例需要实现 ChatHistoryLocalStore 接口, 返回null则不存储历史聊天记录 */
|
|
28
|
+
createChatHistoryStore?: (agent: ChatAgent) => ChatHistoryLocalStore | null;
|
|
30
29
|
/** 是否开启音频合成 */
|
|
31
30
|
enableTts?: boolean;
|
|
32
31
|
}
|
|
@@ -41,15 +40,15 @@ export interface AIStreamHooks {
|
|
|
41
40
|
onSkillsEnd: (skills: ReceivedTextSkillPacketBody[], respMsg: ChatMessage, result: {
|
|
42
41
|
messages: ChatMessage[];
|
|
43
42
|
}) => void;
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
onCardsReceived: (skills: ReceivedTextSkillPacketBody[], result: {
|
|
44
|
+
cards: ChatCardObject[];
|
|
46
45
|
}) => void;
|
|
47
46
|
}
|
|
48
47
|
export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAgent) => {
|
|
49
|
-
hooks: import("hookable").Hookable<
|
|
48
|
+
hooks: import("hookable").Hookable<any, string>;
|
|
50
49
|
aiStream: {
|
|
51
50
|
send: (blocks: InputBlock[], signal?: AbortSignal, extraOptions?: Record<string, any>) => {
|
|
52
|
-
response: import("@ray-js/t-agent").StreamResponse;
|
|
51
|
+
response: import("@ray-js/t-agent").StreamResponse;
|
|
53
52
|
metaPromise: Promise<Record<string, any>>;
|
|
54
53
|
};
|
|
55
54
|
chat: (blocks: InputBlock[], signal?: AbortSignal, options?: {
|
|
@@ -60,6 +59,9 @@ export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAge
|
|
|
60
59
|
options: AIStreamOptions;
|
|
61
60
|
removeMessage: (message: ChatMessage) => Promise<void>;
|
|
62
61
|
clearAllMessages: () => Promise<void>;
|
|
62
|
+
onSkillCompose: (fn: AIStreamHooks['onSkillCompose']) => () => void;
|
|
63
|
+
onSkillsEnd: (fn: AIStreamHooks['onSkillsEnd']) => () => void;
|
|
64
|
+
onCardsReceived: (fn: AIStreamHooks['onCardsReceived']) => () => void;
|
|
63
65
|
feedback: ({ requestId, type }: {
|
|
64
66
|
requestId: string;
|
|
65
67
|
type: string;
|
|
@@ -67,8 +69,5 @@ export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAge
|
|
|
67
69
|
thingjson?: any;
|
|
68
70
|
data: string;
|
|
69
71
|
}>;
|
|
70
|
-
onSkillCompose: (fn: AIStreamHooks['onSkillCompose']) => () => void;
|
|
71
|
-
onSkillsEnd: (fn: AIStreamHooks['onSkillsEnd']) => () => void;
|
|
72
|
-
onTTTAction: (fn: AIStreamHooks['onTTTAction']) => () => void;
|
|
73
72
|
};
|
|
74
73
|
};
|
package/dist/withAIStream.js
CHANGED
|
@@ -9,11 +9,11 @@ import "core-js/modules/esnext.iterator.map.js";
|
|
|
9
9
|
import "core-js/modules/web.dom-collections.iterator.js";
|
|
10
10
|
import { BubbleTileStatus, ChatMessageStatus, createHooks, EmitterEvent } from '@ray-js/t-agent';
|
|
11
11
|
import { messageAppraise } from './utils/apis';
|
|
12
|
-
import {
|
|
13
|
-
import { BizCode, ConnectClientType
|
|
12
|
+
import { getAccountInfo, getCurrentHomeInfo, runTTTAction, sendBlocksToAIStream } from './utils';
|
|
13
|
+
import { BizCode, ConnectClientType } from './AIStreamTypes';
|
|
14
|
+
import { ChatHistoryLocalStore } from './ChatHistoryStore';
|
|
14
15
|
import { DEFAULT_TOKEN_API, DEFAULT_TOKEN_API_VERSION, globalAIStreamClient } from './global';
|
|
15
16
|
import logger from './utils/logger';
|
|
16
|
-
import { ChatHistoryLocalStore } from './ChatHistoryLocalStore';
|
|
17
17
|
export function withAIStream() {
|
|
18
18
|
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
19
19
|
const hooks = createHooks();
|
|
@@ -38,24 +38,11 @@ export function withAIStream() {
|
|
|
38
38
|
const {
|
|
39
39
|
deviceId,
|
|
40
40
|
agentId,
|
|
41
|
-
clientType = ConnectClientType.APP,
|
|
42
41
|
tokenOptions = {
|
|
43
42
|
api: DEFAULT_TOKEN_API,
|
|
44
43
|
version: DEFAULT_TOKEN_API_VERSION
|
|
45
44
|
}
|
|
46
45
|
} = options;
|
|
47
|
-
if (!agentId) {
|
|
48
|
-
throw new Error('agentId is required');
|
|
49
|
-
}
|
|
50
|
-
if (!tokenOptions.api || !tokenOptions.version) {
|
|
51
|
-
throw new Error('tokenOptions.api and tokenOptions.version are required');
|
|
52
|
-
}
|
|
53
|
-
if (clientType === ConnectClientType.DEVICE && !deviceId) {
|
|
54
|
-
throw new Error('deviceId is required when clientType is device');
|
|
55
|
-
}
|
|
56
|
-
if (clientType === ConnectClientType.APP && deviceId) {
|
|
57
|
-
throw new Error('deviceId is not allowed when clientType is app');
|
|
58
|
-
}
|
|
59
46
|
let homeId = options.homeId;
|
|
60
47
|
if (!homeId) {
|
|
61
48
|
const info = await getCurrentHomeInfo();
|
|
@@ -69,7 +56,7 @@ export function withAIStream() {
|
|
|
69
56
|
/*
|
|
70
57
|
* 2. 获取历史消息
|
|
71
58
|
*/
|
|
72
|
-
let historyStore;
|
|
59
|
+
let historyStore = null;
|
|
73
60
|
if (typeof options.createChatHistoryStore === 'function') {
|
|
74
61
|
historyStore = options.createChatHistoryStore(agent);
|
|
75
62
|
} else {
|
|
@@ -100,18 +87,21 @@ export function withAIStream() {
|
|
|
100
87
|
|
|
101
88
|
// 创建 streamSession
|
|
102
89
|
const connection = globalAIStreamClient.getConnection({
|
|
103
|
-
clientType,
|
|
104
|
-
deviceId
|
|
90
|
+
clientType: options.clientType || ConnectClientType.APP,
|
|
91
|
+
deviceId: options.deviceId
|
|
105
92
|
});
|
|
93
|
+
if (options.clientType === ConnectClientType.DEVICE && !options.deviceId) {
|
|
94
|
+
throw new Error('deviceId is required when clientType is device');
|
|
95
|
+
}
|
|
106
96
|
const streamSession = connection.createSession({
|
|
107
|
-
ownerId: clientType === ConnectClientType.DEVICE ? deviceId : "".concat(homeId),
|
|
97
|
+
ownerId: options.clientType === ConnectClientType.DEVICE ? options.deviceId : "".concat(homeId),
|
|
108
98
|
api: tokenOptions.api,
|
|
109
99
|
apiVersion: tokenOptions.version,
|
|
110
100
|
solutionCode: agentId,
|
|
111
|
-
extParams: _objectSpread({
|
|
101
|
+
extParams: _objectSpread(_objectSpread({}, tokenOptions.extParams), {}, {
|
|
112
102
|
needTts: !!options.enableTts,
|
|
113
|
-
deviceId
|
|
114
|
-
}
|
|
103
|
+
deviceId: options.deviceId || undefined
|
|
104
|
+
})
|
|
115
105
|
});
|
|
116
106
|
await session.set('AIStream.streamSession', streamSession);
|
|
117
107
|
if (options.earlyStart) {
|
|
@@ -120,20 +110,6 @@ export function withAIStream() {
|
|
|
120
110
|
logger.error('earlyStart failed', error);
|
|
121
111
|
});
|
|
122
112
|
}
|
|
123
|
-
const observer = new AIStreamObserver(data => {
|
|
124
|
-
if (data.type === 'amplitudes') {
|
|
125
|
-
ui.emitEvent('amplitudes', data);
|
|
126
|
-
} else if (data.type === 'connectionState') {
|
|
127
|
-
ui.emitEvent('networkChange', {
|
|
128
|
-
online: data.body.connectState === ConnectState.CONNECTED
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}, globalAIStreamClient.pool);
|
|
132
|
-
observer.observe({
|
|
133
|
-
connectionState: true,
|
|
134
|
-
amplitudes: true
|
|
135
|
-
});
|
|
136
|
-
await session.set('AIStream.observer', observer);
|
|
137
113
|
});
|
|
138
114
|
const getHistoryStore = () => {
|
|
139
115
|
const historyStore = session.get('AIStream.historyStore');
|
|
@@ -355,12 +331,24 @@ export function withAIStream() {
|
|
|
355
331
|
await hooks.callHook('onSkillsEnd', skills, message, result);
|
|
356
332
|
await message.update();
|
|
357
333
|
}
|
|
334
|
+
let valid = false;
|
|
358
335
|
if (message.bubble.text) {
|
|
336
|
+
valid = true;
|
|
359
337
|
await message.persist();
|
|
360
338
|
} else if (message.bubble.status === BubbleTileStatus.NORMAL) {
|
|
361
|
-
|
|
339
|
+
valid = false;
|
|
362
340
|
} else {
|
|
341
|
+
valid = true;
|
|
342
|
+
}
|
|
343
|
+
if (valid) {
|
|
363
344
|
await message.persist();
|
|
345
|
+
const [_, ...rest] = result.messages;
|
|
346
|
+
for (const m of rest) {
|
|
347
|
+
await m.show();
|
|
348
|
+
await m.persist();
|
|
349
|
+
}
|
|
350
|
+
} else {
|
|
351
|
+
await message.remove();
|
|
364
352
|
}
|
|
365
353
|
return [userMsg, ...result.messages];
|
|
366
354
|
};
|
|
@@ -415,10 +403,6 @@ export function withAIStream() {
|
|
|
415
403
|
};
|
|
416
404
|
});
|
|
417
405
|
onAgentDispose(async () => {
|
|
418
|
-
const observer = session.get('AIStream.observer');
|
|
419
|
-
if (observer) {
|
|
420
|
-
observer.disconnect();
|
|
421
|
-
}
|
|
422
406
|
const streamSession = session.get('AIStream.streamSession');
|
|
423
407
|
|
|
424
408
|
/**
|
|
@@ -480,6 +464,43 @@ export function withAIStream() {
|
|
|
480
464
|
}
|
|
481
465
|
}
|
|
482
466
|
});
|
|
467
|
+
const onSkillsEnd = fn => {
|
|
468
|
+
return hooks.hook('onSkillsEnd', fn);
|
|
469
|
+
};
|
|
470
|
+
onSkillsEnd(async (skills, respMsg, result) => {
|
|
471
|
+
const cards = [];
|
|
472
|
+
for (const skill of skills) {
|
|
473
|
+
var _skill$custom, _skill$general;
|
|
474
|
+
if ((_skill$custom = skill.custom) !== null && _skill$custom !== void 0 && (_skill$custom = _skill$custom.data) !== null && _skill$custom !== void 0 && _skill$custom.aiCards) {
|
|
475
|
+
for (const card of skill.custom.data.aiCards) {
|
|
476
|
+
cards.push(card);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
if ((_skill$general = skill.general) !== null && _skill$general !== void 0 && (_skill$general = _skill$general.data) !== null && _skill$general !== void 0 && _skill$general.aiCards) {
|
|
480
|
+
for (const card of skill.custom.data.aiCards) {
|
|
481
|
+
cards.push(card);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
const r = {
|
|
486
|
+
cards: cards
|
|
487
|
+
};
|
|
488
|
+
await hooks.callHook('onCardsReceived', skills, r);
|
|
489
|
+
for (const card of cards) {
|
|
490
|
+
const m = createMessage({
|
|
491
|
+
role: respMsg.role,
|
|
492
|
+
status: ChatMessageStatus.FINISH,
|
|
493
|
+
meta: {
|
|
494
|
+
eventId: respMsg.meta.eventId,
|
|
495
|
+
sessionId: respMsg.meta.sessionId
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
m.addTile('card', {
|
|
499
|
+
card
|
|
500
|
+
});
|
|
501
|
+
result.messages.push(m);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
483
504
|
return {
|
|
484
505
|
hooks,
|
|
485
506
|
aiStream: {
|
|
@@ -497,16 +518,14 @@ export function withAIStream() {
|
|
|
497
518
|
await historyStore.removeAll();
|
|
498
519
|
}
|
|
499
520
|
},
|
|
500
|
-
feedback,
|
|
501
521
|
onSkillCompose: fn => {
|
|
502
522
|
return hooks.hook('onSkillCompose', fn);
|
|
503
523
|
},
|
|
504
|
-
onSkillsEnd
|
|
505
|
-
|
|
524
|
+
onSkillsEnd,
|
|
525
|
+
onCardsReceived: fn => {
|
|
526
|
+
return hooks.hook('onCardsReceived', fn);
|
|
506
527
|
},
|
|
507
|
-
|
|
508
|
-
return hooks.hook('onTTTAction', fn);
|
|
509
|
-
}
|
|
528
|
+
feedback
|
|
510
529
|
}
|
|
511
530
|
};
|
|
512
531
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ray-js/t-agent-plugin-aistream",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2-beta-2",
|
|
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": "33a1985d3a14487fe5f354411b0c46c8a8af19c7"
|
|
39
39
|
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ChatMessageObject } from '@ray-js/t-agent';
|
|
2
|
-
import { ChatHistoryStore, ChatHistoryStoreOptions, StoredMessageObject, ChatHistoryStorePagination } from './ChatHistoryStore';
|
|
3
|
-
export declare class ChatHistoryLocalStore implements ChatHistoryStore {
|
|
4
|
-
/** 版本号,会作为内部索引的一部分 */
|
|
5
|
-
private readonly version;
|
|
6
|
-
private options;
|
|
7
|
-
constructor(options: ChatHistoryStoreOptions);
|
|
8
|
-
private itemToMessage;
|
|
9
|
-
private getRecordIndex;
|
|
10
|
-
private getQueryCondition;
|
|
11
|
-
query(id: number): Promise<StoredMessageObject | null>;
|
|
12
|
-
queryAll(pagination: ChatHistoryStorePagination): Promise<{
|
|
13
|
-
total: number;
|
|
14
|
-
records: StoredMessageObject[];
|
|
15
|
-
}>;
|
|
16
|
-
update(id: number, body: ChatMessageObject): Promise<void>;
|
|
17
|
-
remove(id: number): Promise<void>;
|
|
18
|
-
removeAll(ids?: number[]): Promise<void>;
|
|
19
|
-
insert(message: ChatMessageObject): Promise<{
|
|
20
|
-
id: number;
|
|
21
|
-
}>;
|
|
22
|
-
}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
|
|
2
|
-
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
-
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
4
|
-
const _excluded = ["id"];
|
|
5
|
-
import "core-js/modules/es.array.sort.js";
|
|
6
|
-
import "core-js/modules/es.json.stringify.js";
|
|
7
|
-
import "core-js/modules/esnext.iterator.constructor.js";
|
|
8
|
-
import "core-js/modules/esnext.iterator.filter.js";
|
|
9
|
-
import "core-js/modules/esnext.iterator.map.js";
|
|
10
|
-
import { safeParseJSON } from '@ray-js/t-agent';
|
|
11
|
-
import logger from './utils/logger';
|
|
12
|
-
import { deleteRecordList, insertRecord, queryRecordList, updateRecord } from './utils';
|
|
13
|
-
export class ChatHistoryLocalStore {
|
|
14
|
-
constructor(options) {
|
|
15
|
-
/** 版本号,会作为内部索引的一部分 */
|
|
16
|
-
_defineProperty(this, "version", 'v1');
|
|
17
|
-
if (!options.agentId) {
|
|
18
|
-
throw new Error('agentId is required');
|
|
19
|
-
}
|
|
20
|
-
if (!options.bizCode) {
|
|
21
|
-
throw new Error('bizCode is required');
|
|
22
|
-
}
|
|
23
|
-
this.options = _objectSpread({
|
|
24
|
-
indexId: 'default',
|
|
25
|
-
homeId: 0
|
|
26
|
-
}, options);
|
|
27
|
-
}
|
|
28
|
-
itemToMessage(item) {
|
|
29
|
-
const messageInfo = safeParseJSON(item.data);
|
|
30
|
-
if (!messageInfo) {
|
|
31
|
-
logger.error('ChatHistoryLocalStore failed parse item: ', item);
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
messageInfo.message.meta.id = item.id;
|
|
35
|
-
return {
|
|
36
|
-
id: item.id,
|
|
37
|
-
indexId: item.index2,
|
|
38
|
-
agentId: item.solutionCode,
|
|
39
|
-
deviceId: item.devId,
|
|
40
|
-
homeId: item.homeId,
|
|
41
|
-
createdAt: messageInfo.createdAt,
|
|
42
|
-
updatedAt: messageInfo.updatedAt,
|
|
43
|
-
message: messageInfo.message
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
getRecordIndex() {
|
|
47
|
-
return {
|
|
48
|
-
bizCode: this.options.bizCode,
|
|
49
|
-
solutionCode: this.options.agentId,
|
|
50
|
-
homeId: this.options.homeId,
|
|
51
|
-
index: "t-agent-".concat(this.version),
|
|
52
|
-
index2: this.options.indexId,
|
|
53
|
-
devId: this.options.deviceId
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
getQueryCondition() {
|
|
57
|
-
const indexes = this.getRecordIndex();
|
|
58
|
-
const params = {
|
|
59
|
-
bizCode: [indexes.bizCode],
|
|
60
|
-
solutionCode: [indexes.solutionCode],
|
|
61
|
-
homeId: [indexes.homeId],
|
|
62
|
-
index: [indexes.index],
|
|
63
|
-
index2: [indexes.index2]
|
|
64
|
-
};
|
|
65
|
-
if (indexes.devId) {
|
|
66
|
-
params.devId = [indexes.devId];
|
|
67
|
-
}
|
|
68
|
-
return params;
|
|
69
|
-
}
|
|
70
|
-
async query(id) {
|
|
71
|
-
if (typeof id !== 'number') {
|
|
72
|
-
logger.warn('ChatHistoryLocalStore query id is not number', {
|
|
73
|
-
id
|
|
74
|
-
});
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
const queryCondition = _objectSpread(_objectSpread({}, this.getQueryCondition()), {}, {
|
|
78
|
-
id: [id],
|
|
79
|
-
offset: 0,
|
|
80
|
-
limit: 1,
|
|
81
|
-
sortType: 1
|
|
82
|
-
});
|
|
83
|
-
const {
|
|
84
|
-
records
|
|
85
|
-
} = await queryRecordList(queryCondition);
|
|
86
|
-
return records[0] ? this.itemToMessage(records[0]) : null;
|
|
87
|
-
}
|
|
88
|
-
async queryAll(pagination) {
|
|
89
|
-
const queryCondition = _objectSpread(_objectSpread({}, this.getQueryCondition()), {}, {
|
|
90
|
-
offset: 0,
|
|
91
|
-
sortType: 1
|
|
92
|
-
});
|
|
93
|
-
const {
|
|
94
|
-
offset,
|
|
95
|
-
limit
|
|
96
|
-
} = pagination || {};
|
|
97
|
-
if (offset) {
|
|
98
|
-
queryCondition.offset = offset;
|
|
99
|
-
}
|
|
100
|
-
if (limit) {
|
|
101
|
-
queryCondition.limit = limit;
|
|
102
|
-
}
|
|
103
|
-
queryCondition.sortType = pagination.sort === 'desc' ? 0 : 1;
|
|
104
|
-
try {
|
|
105
|
-
const result = await queryRecordList(queryCondition);
|
|
106
|
-
const list = result.records.map(this.itemToMessage).filter(item => !!item);
|
|
107
|
-
return {
|
|
108
|
-
total: result.total,
|
|
109
|
-
records: list
|
|
110
|
-
};
|
|
111
|
-
} catch (error) {
|
|
112
|
-
logger.error('ChatHistoryLocalStore queryRecordList error', error);
|
|
113
|
-
return {
|
|
114
|
-
total: 0,
|
|
115
|
-
records: []
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async update(id, body) {
|
|
120
|
-
if (typeof id !== 'number') {
|
|
121
|
-
throw new Error('query id is not number');
|
|
122
|
-
}
|
|
123
|
-
const stored = await this.query(id);
|
|
124
|
-
if (!stored) {
|
|
125
|
-
throw new Error("could not find message: ".concat(id));
|
|
126
|
-
}
|
|
127
|
-
const nowTime = Date.now();
|
|
128
|
-
const msgObject = {
|
|
129
|
-
message: body,
|
|
130
|
-
createdAt: stored.createdAt,
|
|
131
|
-
updatedAt: nowTime
|
|
132
|
-
};
|
|
133
|
-
stored.message.meta.updatedAt = nowTime;
|
|
134
|
-
return updateRecord({
|
|
135
|
-
id,
|
|
136
|
-
data: JSON.stringify(msgObject)
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
async remove(id) {
|
|
140
|
-
if (typeof id !== 'number') {
|
|
141
|
-
throw new Error('query id is not number');
|
|
142
|
-
}
|
|
143
|
-
const stored = await this.query(id);
|
|
144
|
-
if (!stored) {
|
|
145
|
-
logger.warn('ChatHistoryLocalStore not find by id', {
|
|
146
|
-
id
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
await deleteRecordList({
|
|
150
|
-
id: [id]
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
async removeAll(ids) {
|
|
154
|
-
if (ids) {
|
|
155
|
-
if (!Array.isArray(ids)) {
|
|
156
|
-
throw new Error('ids is not array');
|
|
157
|
-
}
|
|
158
|
-
if (ids.length === 0) {
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
await deleteRecordList(_objectSpread({
|
|
162
|
-
id: ids
|
|
163
|
-
}, this.getQueryCondition()));
|
|
164
|
-
} else {
|
|
165
|
-
await deleteRecordList(this.getQueryCondition());
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
async insert(message) {
|
|
169
|
-
const nowTime = Date.now();
|
|
170
|
-
|
|
171
|
-
// 先把 id 提取出来不存,id 始终是在数据库里自增的
|
|
172
|
-
const _message$meta = message.meta,
|
|
173
|
-
{
|
|
174
|
-
id
|
|
175
|
-
} = _message$meta,
|
|
176
|
-
meta = _objectWithoutProperties(_message$meta, _excluded);
|
|
177
|
-
const msgObject = {
|
|
178
|
-
message: _objectSpread(_objectSpread({}, message), {}, {
|
|
179
|
-
meta: _objectSpread(_objectSpread(_objectSpread({}, meta), this.options), {}, {
|
|
180
|
-
createdAt: nowTime,
|
|
181
|
-
updatedAt: nowTime
|
|
182
|
-
})
|
|
183
|
-
}),
|
|
184
|
-
createdAt: nowTime,
|
|
185
|
-
updatedAt: nowTime
|
|
186
|
-
};
|
|
187
|
-
return insertRecord(_objectSpread(_objectSpread({}, this.getRecordIndex()), {}, {
|
|
188
|
-
data: JSON.stringify(msgObject)
|
|
189
|
-
}));
|
|
190
|
-
}
|
|
191
|
-
}
|