@ray-js/t-agent-plugin-aistream 0.2.0-beta.20 → 0.2.1-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 +5 -5
- package/dist/ChatHistoryLocalStore.d.ts +22 -0
- package/dist/ChatHistoryLocalStore.js +191 -0
- package/dist/ChatHistoryStore.d.ts +2 -23
- package/dist/ChatHistoryStore.js +1 -191
- package/dist/buildIn/withBuildIn.js +10 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/utils/AIStream.js +3 -1
- package/dist/utils/observer.d.ts +5 -1
- package/dist/utils/observer.js +21 -14
- package/dist/withAIStream.d.ts +13 -8
- package/dist/withAIStream.js +45 -14
- package/package.json +2 -2
package/dist/AIStreamTypes.d.ts
CHANGED
|
@@ -1601,17 +1601,17 @@ export type ReceivedSearchKnowledgeSkill = ReceivedTextSkillPacketBody<BuildInSk
|
|
|
1601
1601
|
};
|
|
1602
1602
|
}>;
|
|
1603
1603
|
export interface ReceivedSmartHomeSkillDevice {
|
|
1604
|
-
|
|
1605
|
-
|
|
1604
|
+
devId: string;
|
|
1605
|
+
devIcon: string;
|
|
1606
1606
|
dps?: Record<string, string>;
|
|
1607
|
-
|
|
1607
|
+
devName: string;
|
|
1608
1608
|
room: string;
|
|
1609
1609
|
success: boolean;
|
|
1610
1610
|
}
|
|
1611
1611
|
export interface ReceivedSmartHomeSkillScene {
|
|
1612
1612
|
sceneId: string;
|
|
1613
|
-
|
|
1614
|
-
|
|
1613
|
+
sceneName: string;
|
|
1614
|
+
sceneIcon: string;
|
|
1615
1615
|
type: number;
|
|
1616
1616
|
valid: boolean;
|
|
1617
1617
|
displayColor: string;
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
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
|
+
}
|
|
@@ -10,7 +10,7 @@ export interface StoredMessageObject {
|
|
|
10
10
|
homeId?: number;
|
|
11
11
|
indexId?: string;
|
|
12
12
|
}
|
|
13
|
-
interface
|
|
13
|
+
export interface ChatHistoryStorePagination {
|
|
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: ChatHistoryStorePagination): Promise<{
|
|
34
34
|
total: number;
|
|
35
35
|
records: StoredMessageObject[];
|
|
36
36
|
}>;
|
|
@@ -45,24 +45,3 @@ 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,191 +1 @@
|
|
|
1
|
-
|
|
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
|
-
}
|
|
1
|
+
export {};
|
|
@@ -90,8 +90,8 @@ export function withBuildIn() {
|
|
|
90
90
|
data.sceneInfo.push({
|
|
91
91
|
type: scene.type,
|
|
92
92
|
enabled: scene.enable,
|
|
93
|
-
icon: scene.
|
|
94
|
-
name: scene.
|
|
93
|
+
icon: scene.sceneIcon,
|
|
94
|
+
name: scene.sceneName,
|
|
95
95
|
sceneId: scene.sceneId,
|
|
96
96
|
intent: 'queryScene',
|
|
97
97
|
valid: scene.valid,
|
|
@@ -103,8 +103,8 @@ export function withBuildIn() {
|
|
|
103
103
|
for (const scene of content.general.data.scenes) {
|
|
104
104
|
data.sceneInfo.push({
|
|
105
105
|
type: scene.type,
|
|
106
|
-
icon: scene.
|
|
107
|
-
name: scene.
|
|
106
|
+
icon: scene.sceneIcon,
|
|
107
|
+
name: scene.sceneName,
|
|
108
108
|
sceneId: scene.sceneId,
|
|
109
109
|
intent: 'controlScene',
|
|
110
110
|
valid: scene.valid,
|
|
@@ -115,9 +115,9 @@ export function withBuildIn() {
|
|
|
115
115
|
} else if (content.general.action === ReceivedSmartHomeSkillAction.QUERY_DEVICE) {
|
|
116
116
|
for (const dev of content.general.data.devices) {
|
|
117
117
|
data.deviceInfo.push({
|
|
118
|
-
icon: dev.
|
|
119
|
-
name: dev.
|
|
120
|
-
deviceId: dev.
|
|
118
|
+
icon: dev.devIcon,
|
|
119
|
+
name: dev.devName,
|
|
120
|
+
deviceId: dev.devId,
|
|
121
121
|
intent: 'queryDevice',
|
|
122
122
|
room: dev.room,
|
|
123
123
|
success: dev.success
|
|
@@ -126,9 +126,9 @@ export function withBuildIn() {
|
|
|
126
126
|
} else if (content.general.action === ReceivedSmartHomeSkillAction.CONTROL_DEVICE) {
|
|
127
127
|
for (const dev of content.general.data.devices) {
|
|
128
128
|
data.deviceInfo.push({
|
|
129
|
-
icon: dev.
|
|
130
|
-
name: dev.
|
|
131
|
-
deviceId: dev.
|
|
129
|
+
icon: dev.devIcon,
|
|
130
|
+
name: dev.devName,
|
|
131
|
+
deviceId: dev.devId,
|
|
132
132
|
intent: 'controlDevice',
|
|
133
133
|
success: null
|
|
134
134
|
});
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/utils/AIStream.js
CHANGED
package/dist/utils/observer.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AudioBody, ConnectStateBody, EventBody, FileBody, ImageBody, SessionStateBody, TextBody, VideoBody } from '../AIStreamTypes';
|
|
1
|
+
import { AudioBody, ConnectStateBody, EventBody, FileBody, ImageBody, RecordAmplitudesBody, SessionStateBody, TextBody, VideoBody } from '../AIStreamTypes';
|
|
2
2
|
export type AIStreamDataEntry = {
|
|
3
3
|
type: 'text';
|
|
4
4
|
body: TextBody;
|
|
@@ -23,6 +23,9 @@ export type AIStreamDataEntry = {
|
|
|
23
23
|
} | {
|
|
24
24
|
type: 'sessionState';
|
|
25
25
|
body: SessionStateBody;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'amplitudes';
|
|
28
|
+
body: RecordAmplitudesBody;
|
|
26
29
|
};
|
|
27
30
|
export interface AIStreamObserverOptions {
|
|
28
31
|
sessionState?: boolean;
|
|
@@ -35,6 +38,7 @@ export interface AIStreamObserverOptions {
|
|
|
35
38
|
image?: boolean;
|
|
36
39
|
dataChannels?: string[];
|
|
37
40
|
sessionId?: string;
|
|
41
|
+
amplitudes?: boolean;
|
|
38
42
|
}
|
|
39
43
|
export declare class AIStreamObserverPool {
|
|
40
44
|
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, listenSessionStateChanged, listenTextReceived } from './ttt';
|
|
6
|
+
import { listenAudioReceived, listenConnectStateChanged, listenEventReceived, listenImageReceived, listenRecordAmplitudes, 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', 'amplitudes'];
|
|
9
9
|
export class AIStreamObserverPool {
|
|
10
10
|
constructor() {
|
|
11
11
|
_defineProperty(this, "isStarted", false);
|
|
@@ -18,7 +18,8 @@ export class AIStreamObserverPool {
|
|
|
18
18
|
audio: new Set(),
|
|
19
19
|
video: new Set(),
|
|
20
20
|
file: new Set(),
|
|
21
|
-
image: new Set()
|
|
21
|
+
image: new Set(),
|
|
22
|
+
amplitudes: new Set()
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
25
|
start() {
|
|
@@ -26,19 +27,21 @@ export class AIStreamObserverPool {
|
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
28
29
|
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
|
-
|
|
32
|
+
if (entry.type !== 'amplitudes') {
|
|
33
|
+
var _entry$body;
|
|
34
|
+
if (entry.type === 'connectionState') {
|
|
35
|
+
state = "".concat(ConnectState[entry.body.connectState], " ").concat(entry.body.code || '');
|
|
36
|
+
} else if (entry.type === 'sessionState') {
|
|
37
|
+
state = "".concat(SessionState[entry.body.sessionState], " ").concat(entry.body.code || '');
|
|
38
|
+
} else if (entry.type === 'event') {
|
|
39
|
+
state = "".concat(EventType[entry.body.eventType]);
|
|
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);
|
|
40
44
|
}
|
|
41
|
-
logger.debug("Pool received: %c".concat(observers.size ? '⊕' : '×').concat(entry.type, " ").concat(state), 'background: black; color: white', entry);
|
|
42
45
|
observers.forEach(observer => {
|
|
43
46
|
if (entry.type === 'text' || entry.type === 'audio' || entry.type === 'video' || entry.type === 'file' || entry.type === 'image') {
|
|
44
47
|
const {
|
|
@@ -78,6 +81,9 @@ export class AIStreamObserverPool {
|
|
|
78
81
|
})), listenImageReceived(body => handle({
|
|
79
82
|
type: 'image',
|
|
80
83
|
body
|
|
84
|
+
})), listenRecordAmplitudes(body => handle({
|
|
85
|
+
type: 'amplitudes',
|
|
86
|
+
body
|
|
81
87
|
}))
|
|
82
88
|
// listenVideoReceived(body => handle({ type: 'video', body })),
|
|
83
89
|
// listenFileReceived(body => handle({ type: 'file', body })),
|
|
@@ -96,7 +102,8 @@ export class AIStreamObserverPool {
|
|
|
96
102
|
audio: new Set(),
|
|
97
103
|
video: new Set(),
|
|
98
104
|
file: new Set(),
|
|
99
|
-
image: new Set()
|
|
105
|
+
image: new Set(),
|
|
106
|
+
amplitudes: new Set()
|
|
100
107
|
};
|
|
101
108
|
}
|
|
102
109
|
connect(observer) {
|
package/dist/withAIStream.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { ChatAgent, ChatMessage, GetChatPluginHandler, InputBlock } from '@ray-js/t-agent';
|
|
1
|
+
import { ChatAgent, ChatMessage, ChatTile, GetChatPluginHandler, InputBlock } from '@ray-js/t-agent';
|
|
2
|
+
import { TTTAction } from './utils';
|
|
2
3
|
import { ConnectClientType, ReceivedTextSkillPacketBody } from './AIStreamTypes';
|
|
3
|
-
import {
|
|
4
|
+
import { ChatHistoryStore, StoredMessageObject } from './ChatHistoryStore';
|
|
4
5
|
export interface AIStreamOptions {
|
|
5
6
|
/** client 类型: 1-作为设备代理, 2-作为 App */
|
|
6
7
|
clientType?: ConnectClientType;
|
|
@@ -24,8 +25,8 @@ export interface AIStreamOptions {
|
|
|
24
25
|
homeId?: number;
|
|
25
26
|
/** 是否在 onAgentStart 阶段就建立连接 */
|
|
26
27
|
earlyStart?: boolean;
|
|
27
|
-
/** 自定义消息存储, 返回的实例需要实现
|
|
28
|
-
createChatHistoryStore?: (agent: ChatAgent) =>
|
|
28
|
+
/** 自定义消息存储, 返回的实例需要实现 ChatHistoryStore 接口, 返回null则不存储历史聊天记录 */
|
|
29
|
+
createChatHistoryStore?: (agent: ChatAgent) => ChatHistoryStore | null;
|
|
29
30
|
/** 是否开启音频合成 */
|
|
30
31
|
enableTts?: boolean;
|
|
31
32
|
}
|
|
@@ -40,12 +41,15 @@ export interface AIStreamHooks {
|
|
|
40
41
|
onSkillsEnd: (skills: ReceivedTextSkillPacketBody[], respMsg: ChatMessage, result: {
|
|
41
42
|
messages: ChatMessage[];
|
|
42
43
|
}) => void;
|
|
44
|
+
onTTTAction: (tile: ChatTile | null, result: {
|
|
45
|
+
action?: TTTAction;
|
|
46
|
+
}) => void;
|
|
43
47
|
}
|
|
44
48
|
export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAgent) => {
|
|
45
|
-
hooks: import("hookable").Hookable<
|
|
49
|
+
hooks: import("hookable").Hookable<AIStreamHooks, import("hookable").HookKeys<AIStreamHooks>>;
|
|
46
50
|
aiStream: {
|
|
47
51
|
send: (blocks: InputBlock[], signal?: AbortSignal, extraOptions?: Record<string, any>) => {
|
|
48
|
-
response: import("@ray-js/t-agent").StreamResponse;
|
|
52
|
+
response: import("@ray-js/t-agent").StreamResponse; /** 历史消息数量,默认1000,为0的话,则已分页的方式取全部数据 */
|
|
49
53
|
metaPromise: Promise<Record<string, any>>;
|
|
50
54
|
};
|
|
51
55
|
chat: (blocks: InputBlock[], signal?: AbortSignal, options?: {
|
|
@@ -56,8 +60,6 @@ export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAge
|
|
|
56
60
|
options: AIStreamOptions;
|
|
57
61
|
removeMessage: (message: ChatMessage) => Promise<void>;
|
|
58
62
|
clearAllMessages: () => Promise<void>;
|
|
59
|
-
onSkillCompose: (fn: AIStreamHooks['onSkillCompose']) => () => void;
|
|
60
|
-
onSkillsEnd: (fn: AIStreamHooks['onSkillsEnd']) => () => void;
|
|
61
63
|
feedback: ({ requestId, type }: {
|
|
62
64
|
requestId: string;
|
|
63
65
|
type: string;
|
|
@@ -65,5 +67,8 @@ export declare function withAIStream(options?: AIStreamOptions): (agent: ChatAge
|
|
|
65
67
|
thingjson?: any;
|
|
66
68
|
data: string;
|
|
67
69
|
}>;
|
|
70
|
+
onSkillCompose: (fn: AIStreamHooks['onSkillCompose']) => () => void;
|
|
71
|
+
onSkillsEnd: (fn: AIStreamHooks['onSkillsEnd']) => () => void;
|
|
72
|
+
onTTTAction: (fn: AIStreamHooks['onTTTAction']) => () => void;
|
|
68
73
|
};
|
|
69
74
|
};
|
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 { getAccountInfo, getCurrentHomeInfo, runTTTAction, sendBlocksToAIStream } from './utils';
|
|
13
|
-
import { BizCode, ConnectClientType } from './AIStreamTypes';
|
|
14
|
-
import { ChatHistoryLocalStore } from './ChatHistoryStore';
|
|
12
|
+
import { AIStreamObserver, getAccountInfo, getCurrentHomeInfo, runTTTAction, sendBlocksToAIStream } from './utils';
|
|
13
|
+
import { BizCode, ConnectClientType, ConnectState } from './AIStreamTypes';
|
|
15
14
|
import { DEFAULT_TOKEN_API, DEFAULT_TOKEN_API_VERSION, globalAIStreamClient } from './global';
|
|
16
15
|
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,11 +38,24 @@ export function withAIStream() {
|
|
|
38
38
|
const {
|
|
39
39
|
deviceId,
|
|
40
40
|
agentId,
|
|
41
|
+
clientType = ConnectClientType.APP,
|
|
41
42
|
tokenOptions = {
|
|
42
43
|
api: DEFAULT_TOKEN_API,
|
|
43
44
|
version: DEFAULT_TOKEN_API_VERSION
|
|
44
45
|
}
|
|
45
46
|
} = 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
|
+
}
|
|
46
59
|
let homeId = options.homeId;
|
|
47
60
|
if (!homeId) {
|
|
48
61
|
const info = await getCurrentHomeInfo();
|
|
@@ -56,7 +69,7 @@ export function withAIStream() {
|
|
|
56
69
|
/*
|
|
57
70
|
* 2. 获取历史消息
|
|
58
71
|
*/
|
|
59
|
-
let historyStore
|
|
72
|
+
let historyStore;
|
|
60
73
|
if (typeof options.createChatHistoryStore === 'function') {
|
|
61
74
|
historyStore = options.createChatHistoryStore(agent);
|
|
62
75
|
} else {
|
|
@@ -87,21 +100,18 @@ export function withAIStream() {
|
|
|
87
100
|
|
|
88
101
|
// 创建 streamSession
|
|
89
102
|
const connection = globalAIStreamClient.getConnection({
|
|
90
|
-
clientType
|
|
91
|
-
deviceId
|
|
103
|
+
clientType,
|
|
104
|
+
deviceId
|
|
92
105
|
});
|
|
93
|
-
if (options.clientType === ConnectClientType.DEVICE && !options.deviceId) {
|
|
94
|
-
throw new Error('deviceId is required when clientType is device');
|
|
95
|
-
}
|
|
96
106
|
const streamSession = connection.createSession({
|
|
97
|
-
ownerId:
|
|
107
|
+
ownerId: clientType === ConnectClientType.DEVICE ? deviceId : "".concat(homeId),
|
|
98
108
|
api: tokenOptions.api,
|
|
99
109
|
apiVersion: tokenOptions.version,
|
|
100
110
|
solutionCode: agentId,
|
|
101
|
-
extParams: _objectSpread(
|
|
111
|
+
extParams: _objectSpread({
|
|
102
112
|
needTts: !!options.enableTts,
|
|
103
|
-
deviceId
|
|
104
|
-
})
|
|
113
|
+
deviceId
|
|
114
|
+
}, tokenOptions.extParams)
|
|
105
115
|
});
|
|
106
116
|
await session.set('AIStream.streamSession', streamSession);
|
|
107
117
|
if (options.earlyStart) {
|
|
@@ -110,6 +120,20 @@ export function withAIStream() {
|
|
|
110
120
|
logger.error('earlyStart failed', error);
|
|
111
121
|
});
|
|
112
122
|
}
|
|
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);
|
|
113
137
|
});
|
|
114
138
|
const getHistoryStore = () => {
|
|
115
139
|
const historyStore = session.get('AIStream.historyStore');
|
|
@@ -391,6 +415,10 @@ export function withAIStream() {
|
|
|
391
415
|
};
|
|
392
416
|
});
|
|
393
417
|
onAgentDispose(async () => {
|
|
418
|
+
const observer = session.get('AIStream.observer');
|
|
419
|
+
if (observer) {
|
|
420
|
+
observer.disconnect();
|
|
421
|
+
}
|
|
394
422
|
const streamSession = session.get('AIStream.streamSession');
|
|
395
423
|
|
|
396
424
|
/**
|
|
@@ -469,13 +497,16 @@ export function withAIStream() {
|
|
|
469
497
|
await historyStore.removeAll();
|
|
470
498
|
}
|
|
471
499
|
},
|
|
500
|
+
feedback,
|
|
472
501
|
onSkillCompose: fn => {
|
|
473
502
|
return hooks.hook('onSkillCompose', fn);
|
|
474
503
|
},
|
|
475
504
|
onSkillsEnd: fn => {
|
|
476
505
|
return hooks.hook('onSkillsEnd', fn);
|
|
477
506
|
},
|
|
478
|
-
|
|
507
|
+
onTTTAction: fn => {
|
|
508
|
+
return hooks.hook('onTTTAction', fn);
|
|
509
|
+
}
|
|
479
510
|
}
|
|
480
511
|
};
|
|
481
512
|
};
|
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.1-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": "3d7b5c0ca1816855f1a0c4a2da3e59ad44f1b6da"
|
|
39
39
|
}
|