@applica-software-guru/persona-sdk 0.1.61 → 0.1.62
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/bundle.cjs.js +3 -3
- package/dist/bundle.cjs.js.map +1 -1
- package/dist/bundle.es.js +318 -308
- package/dist/bundle.es.js.map +1 -1
- package/dist/bundle.iife.js +3 -3
- package/dist/bundle.iife.js.map +1 -1
- package/dist/bundle.umd.js +3 -3
- package/dist/bundle.umd.js.map +1 -1
- package/dist/protocol/base.d.ts +5 -5
- package/dist/protocol/base.d.ts.map +1 -1
- package/dist/protocol/rest.d.ts +3 -2
- package/dist/protocol/rest.d.ts.map +1 -1
- package/dist/protocol/transaction.d.ts +2 -2
- package/dist/protocol/transaction.d.ts.map +1 -1
- package/dist/protocol/webrtc.d.ts +3 -3
- package/dist/protocol/webrtc.d.ts.map +1 -1
- package/dist/protocol/websocket.d.ts +2 -2
- package/dist/protocol/websocket.d.ts.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/types.d.ts +18 -11
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/playground/src/chat.tsx +8 -3
- package/src/protocol/base.ts +5 -6
- package/src/protocol/rest.ts +19 -8
- package/src/protocol/transaction.ts +2 -5
- package/src/protocol/webrtc.ts +8 -8
- package/src/protocol/websocket.ts +5 -5
- package/src/runtime.tsx +14 -5
- package/src/types.ts +22 -12
package/playground/src/chat.tsx
CHANGED
|
@@ -72,9 +72,16 @@ function Chat() {
|
|
|
72
72
|
<PersonaRuntimeProvider
|
|
73
73
|
dev
|
|
74
74
|
logger={logger}
|
|
75
|
+
context={{
|
|
76
|
+
data: {
|
|
77
|
+
username: 'Bruno Trimone Agent',
|
|
78
|
+
userAgent: navigator.userAgent,
|
|
79
|
+
},
|
|
80
|
+
}}
|
|
75
81
|
tools={{
|
|
76
82
|
get_user_agent: () => {
|
|
77
|
-
|
|
83
|
+
const userAgent = 'Bruno Trimone Agent';
|
|
84
|
+
return { userAgent };
|
|
78
85
|
},
|
|
79
86
|
get_client_date: () => {
|
|
80
87
|
const date = new Date();
|
|
@@ -83,8 +90,6 @@ function Chat() {
|
|
|
83
90
|
}}
|
|
84
91
|
protocols={{
|
|
85
92
|
rest: true,
|
|
86
|
-
webrtc: true,
|
|
87
|
-
websocket: true,
|
|
88
93
|
}}
|
|
89
94
|
session={session}
|
|
90
95
|
apiKey="2398utf8g$9pahwv8#93q8.h8349q*!ty89w4uefghwqh849tg934yg894hq3g89q34h9"
|
package/src/protocol/base.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MessageListenerCallback,
|
|
3
|
-
|
|
4
|
-
PersonaPayload,
|
|
3
|
+
PersonaPacket,
|
|
5
4
|
PersonaProtocol,
|
|
6
5
|
PersonaTransaction,
|
|
7
6
|
ProtocolStatus,
|
|
@@ -21,17 +20,17 @@ abstract class PersonaProtocolBase implements PersonaProtocol {
|
|
|
21
20
|
this.statusChangeCallbacks.push(callback);
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
public
|
|
23
|
+
public addPacketListener(callback: MessageListenerCallback) {
|
|
25
24
|
this.messageCallbacks.push(callback);
|
|
26
25
|
}
|
|
27
26
|
public async syncSession(session: Session): Promise<void> {
|
|
28
27
|
this.session = session;
|
|
29
28
|
}
|
|
30
29
|
|
|
31
|
-
public async
|
|
30
|
+
public async notifyPacket(message: PersonaPacket): Promise<void> {
|
|
32
31
|
this.messageCallbacks.forEach((callback) => callback(message));
|
|
33
32
|
}
|
|
34
|
-
public async
|
|
33
|
+
public async notifyPackets(messages: PersonaPacket[]): Promise<void> {
|
|
35
34
|
messages.forEach((message) => {
|
|
36
35
|
this.messageCallbacks.forEach((callback) => callback(message));
|
|
37
36
|
});
|
|
@@ -58,7 +57,7 @@ abstract class PersonaProtocolBase implements PersonaProtocol {
|
|
|
58
57
|
abstract getPriority(): number;
|
|
59
58
|
abstract connect(session?: Session): Promise<Session>;
|
|
60
59
|
abstract disconnect(): Promise<void>;
|
|
61
|
-
abstract
|
|
60
|
+
abstract sendPacket(packet: PersonaPacket): Promise<void>;
|
|
62
61
|
|
|
63
62
|
public onTransaction(_: PersonaTransaction) {}
|
|
64
63
|
}
|
package/src/protocol/rest.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { PersonaProtocolBase } from './base';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
PersonaResponse,
|
|
4
|
+
Session,
|
|
5
|
+
ProtocolStatus,
|
|
6
|
+
PersonaProtocolBaseConfig,
|
|
7
|
+
PersonaMessage,
|
|
8
|
+
PersonaPacket,
|
|
9
|
+
PersonaCommand,
|
|
10
|
+
} from '../types';
|
|
3
11
|
|
|
4
12
|
type PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {
|
|
5
13
|
apiUrl: string;
|
|
@@ -11,6 +19,7 @@ class PersonaRESTProtocol extends PersonaProtocolBase {
|
|
|
11
19
|
session: Session;
|
|
12
20
|
config: PersonaRESTProtocolConfig;
|
|
13
21
|
notify: boolean = true;
|
|
22
|
+
context: Record<string, any> = {};
|
|
14
23
|
|
|
15
24
|
constructor(config: PersonaRESTProtocolConfig) {
|
|
16
25
|
super();
|
|
@@ -41,22 +50,24 @@ class PersonaRESTProtocol extends PersonaProtocolBase {
|
|
|
41
50
|
this.session = session;
|
|
42
51
|
}
|
|
43
52
|
|
|
44
|
-
public async
|
|
53
|
+
public async sendPacket(packet: PersonaPacket): Promise<void> {
|
|
45
54
|
const { apiUrl, apiKey, agentId } = this.config;
|
|
46
55
|
const sessionId = this.session ?? 'new';
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
if (packet.type === 'command' && (packet?.payload as PersonaCommand)?.command == 'set_initial_context') {
|
|
57
|
+
this.context = (packet?.payload as PersonaCommand)?.arguments;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const input = packet.payload as PersonaMessage;
|
|
61
|
+
const response = await fetch(`${apiUrl}/sessions/${sessionId}/messages`, {
|
|
62
|
+
body: JSON.stringify({ agentId, userMessage: input, initial_context: this.context }),
|
|
51
63
|
method: 'POST',
|
|
52
64
|
headers: {
|
|
53
65
|
'Content-Type': 'application/json',
|
|
54
|
-
'x-fox-apikey': apiKey,
|
|
55
66
|
'x-persona-apikey': apiKey,
|
|
56
67
|
},
|
|
57
68
|
});
|
|
58
69
|
const personaResponse = (await response.json()) as PersonaResponse;
|
|
59
|
-
this.
|
|
70
|
+
this.notifyPackets(
|
|
60
71
|
personaResponse.response.messages.map((payload) => ({
|
|
61
72
|
type: 'message',
|
|
62
73
|
payload,
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
PersonaTransaction,
|
|
7
7
|
FunctionCall,
|
|
8
8
|
ReadonlyJSONObject,
|
|
9
|
-
|
|
9
|
+
PersonaPacket,
|
|
10
10
|
} from '../types';
|
|
11
11
|
|
|
12
12
|
type FinishTransactionRequest = {
|
|
@@ -134,10 +134,7 @@ class PersonaTransactionProtocol extends PersonaProtocolBase {
|
|
|
134
134
|
this.session = session;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
public async
|
|
138
|
-
this.config.logger?.debug('Sending message:', message);
|
|
139
|
-
throw new Error('Not implemented');
|
|
140
|
-
}
|
|
137
|
+
public async sendPacket(_: PersonaPacket): Promise<void> {}
|
|
141
138
|
|
|
142
139
|
public onTransaction(transaction: PersonaTransaction): void {
|
|
143
140
|
if (!this.config.onTransaction) {
|
package/src/protocol/webrtc.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PersonaProtocolBase } from './base';
|
|
2
|
-
import {
|
|
2
|
+
import { PersonaPacket, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';
|
|
3
3
|
|
|
4
4
|
type AudioAnalysisData = {
|
|
5
5
|
localAmplitude: number;
|
|
@@ -187,14 +187,14 @@ class PersonaWebRTCClient {
|
|
|
187
187
|
};
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
public
|
|
190
|
+
public sendPacket(packet: PersonaPacket): void {
|
|
191
191
|
if (!this.dataChannel) {
|
|
192
192
|
this.config.logger?.warn('Data channel is not open, cannot send message');
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
this.dataChannel.send(JSON.stringify(
|
|
197
|
-
this.config.logger?.info('Sent message:',
|
|
196
|
+
this.dataChannel.send(JSON.stringify(packet));
|
|
197
|
+
this.config.logger?.info('Sent message:', packet);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
private _startAnalyzers(): void {
|
|
@@ -274,8 +274,8 @@ class PersonaWebRTCProtocol extends PersonaProtocolBase {
|
|
|
274
274
|
this.autostart = config?.autostart ?? false;
|
|
275
275
|
this.webRTCClient = new PersonaWebRTCClient(config);
|
|
276
276
|
this.webRTCClient.addMessageCallback((msg: MessageEvent) => {
|
|
277
|
-
const data = JSON.parse(msg.data) as
|
|
278
|
-
this.
|
|
277
|
+
const data = JSON.parse(msg.data) as PersonaPacket;
|
|
278
|
+
this.notifyPacket(data);
|
|
279
279
|
});
|
|
280
280
|
}
|
|
281
281
|
|
|
@@ -322,12 +322,12 @@ class PersonaWebRTCProtocol extends PersonaProtocolBase {
|
|
|
322
322
|
this.config?.logger?.debug('Disconnected from WebRTC');
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
public
|
|
325
|
+
public sendPacket(packet: PersonaPacket): Promise<void> {
|
|
326
326
|
if (this.status !== 'connected') {
|
|
327
327
|
return Promise.reject(new Error('Not connected'));
|
|
328
328
|
}
|
|
329
329
|
|
|
330
|
-
this.webRTCClient.
|
|
330
|
+
this.webRTCClient.sendPacket(packet);
|
|
331
331
|
return Promise.resolve();
|
|
332
332
|
}
|
|
333
333
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PersonaPacket, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';
|
|
2
2
|
import { PersonaProtocolBase } from './base';
|
|
3
3
|
|
|
4
4
|
type PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {
|
|
@@ -56,8 +56,8 @@ class PersonaWebSocketProtocol extends PersonaProtocolBase {
|
|
|
56
56
|
this.setStatus('connected');
|
|
57
57
|
});
|
|
58
58
|
this.webSocket.addEventListener('message', (event) => {
|
|
59
|
-
const data = JSON.parse(event.data) as
|
|
60
|
-
this.
|
|
59
|
+
const data = JSON.parse(event.data) as PersonaPacket;
|
|
60
|
+
this.notifyPacket(data);
|
|
61
61
|
});
|
|
62
62
|
this.webSocket.addEventListener('close', () => {
|
|
63
63
|
this.setStatus('disconnected');
|
|
@@ -86,9 +86,9 @@ class PersonaWebSocketProtocol extends PersonaProtocolBase {
|
|
|
86
86
|
return Promise.resolve();
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
public
|
|
89
|
+
public sendPacket(packet: PersonaPacket): Promise<void> {
|
|
90
90
|
if (this.webSocket && this.status === 'connected') {
|
|
91
|
-
this.webSocket.send(JSON.stringify(
|
|
91
|
+
this.webSocket.send(JSON.stringify(packet));
|
|
92
92
|
return Promise.resolve();
|
|
93
93
|
} else {
|
|
94
94
|
return Promise.reject(new Error('WebSocket is not connected'));
|
package/src/runtime.tsx
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
PersonaConfig,
|
|
11
11
|
PersonaMessage,
|
|
12
|
-
|
|
12
|
+
PersonaPacket,
|
|
13
13
|
PersonaProtocol,
|
|
14
14
|
PersonaProtocolBaseConfig,
|
|
15
15
|
PersonaReasoning,
|
|
@@ -162,9 +162,18 @@ function PersonaRuntimeProviderInner({
|
|
|
162
162
|
protocol.addStatusChangeListener((status: ProtocolStatus) => {
|
|
163
163
|
logger?.debug(`${protocol.getName()} has notified new status: ${status}`);
|
|
164
164
|
protocolsStatus.set(protocol.getName(), status);
|
|
165
|
+
if (status === 'connected' && config.context) {
|
|
166
|
+
protocol.sendPacket({
|
|
167
|
+
type: 'command',
|
|
168
|
+
payload: {
|
|
169
|
+
command: 'set_initial_context',
|
|
170
|
+
arguments: config.context,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
165
174
|
setProtocolsStatus(new Map(protocolsStatus));
|
|
166
175
|
});
|
|
167
|
-
protocol.
|
|
176
|
+
protocol.addPacketListener((message: PersonaPacket) => {
|
|
168
177
|
if (message.type === 'message') {
|
|
169
178
|
const personaMessage = message.payload as PersonaMessage;
|
|
170
179
|
setMessages((currentConversation) =>
|
|
@@ -227,7 +236,7 @@ function PersonaRuntimeProviderInner({
|
|
|
227
236
|
});
|
|
228
237
|
}
|
|
229
238
|
logger?.debug('Sending message:', content);
|
|
230
|
-
await protocol?.
|
|
239
|
+
await protocol?.sendPacket({ type: 'request', payload: content });
|
|
231
240
|
|
|
232
241
|
setIsRunning(false);
|
|
233
242
|
};
|
|
@@ -302,10 +311,10 @@ function usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null {
|
|
|
302
311
|
...protocolInstance,
|
|
303
312
|
connect: protocolInstance.connect.bind(protocolInstance),
|
|
304
313
|
disconnect: protocolInstance.disconnect.bind(protocolInstance),
|
|
305
|
-
|
|
314
|
+
sendPacket: protocolInstance.sendPacket.bind(protocolInstance),
|
|
306
315
|
setSession: protocolInstance.setSession.bind(protocolInstance),
|
|
307
316
|
addStatusChangeListener: protocolInstance.addStatusChangeListener.bind(protocolInstance),
|
|
308
|
-
|
|
317
|
+
addPacketListener: protocolInstance.addPacketListener.bind(protocolInstance),
|
|
309
318
|
getName: protocolInstance.getName.bind(protocolInstance),
|
|
310
319
|
getPriority: protocolInstance.getPriority.bind(protocolInstance),
|
|
311
320
|
status: status || protocolInstance.status,
|
package/src/types.ts
CHANGED
|
@@ -38,9 +38,9 @@ export type PersonaSession = {
|
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
export type PersonaAgentContext = {
|
|
41
|
-
data: unknown
|
|
42
|
-
files
|
|
43
|
-
session
|
|
41
|
+
data: Record<string, unknown>;
|
|
42
|
+
files?: PersonaFile[];
|
|
43
|
+
session?: PersonaSession;
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
export type PersonaTransaction = {
|
|
@@ -78,13 +78,27 @@ export type PersonaSource = {
|
|
|
78
78
|
mostRelevant?: boolean;
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
+
export type PersonaCommand = {
|
|
82
|
+
command: 'get_mcp_assets' | 'set_initial_context';
|
|
83
|
+
arguments: Record<string, unknown>;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export type PersonaRequest = PersonaMessage | Array<PersonaMessage> | string;
|
|
87
|
+
|
|
88
|
+
export type PersonaPacketPayload = PersonaRequest | PersonaCommand | PersonaReasoning | PersonaTransaction;
|
|
89
|
+
|
|
90
|
+
export type PersonaPacket = {
|
|
91
|
+
type: 'request' | 'message' | 'command' | 'reasoning' | 'mcp_assets' | 'transaction';
|
|
92
|
+
payload?: PersonaPacketPayload;
|
|
93
|
+
};
|
|
94
|
+
|
|
81
95
|
export type PersonaMessage = {
|
|
82
96
|
id?: string | null;
|
|
83
97
|
protocol?: string;
|
|
84
98
|
thought?: string;
|
|
85
99
|
text: string; //todo: puo essere null
|
|
86
100
|
image?: PersonaImage;
|
|
87
|
-
type: 'reasoning' | 'text' | 'transaction';
|
|
101
|
+
type: 'reasoning' | 'text' | 'transaction' | 'command';
|
|
88
102
|
role: 'user' | 'assistant' | 'function';
|
|
89
103
|
files?: PersonaFile[];
|
|
90
104
|
sources?: PersonaSource[];
|
|
@@ -94,11 +108,6 @@ export type PersonaMessage = {
|
|
|
94
108
|
functionResponse?: FunctionResponse;
|
|
95
109
|
};
|
|
96
110
|
|
|
97
|
-
export type PersonaPayload = {
|
|
98
|
-
type: 'message' | 'transaction' | 'reasoning';
|
|
99
|
-
payload: PersonaMessage | PersonaTransaction | PersonaReasoning;
|
|
100
|
-
};
|
|
101
|
-
|
|
102
111
|
export type ModelResponse = {
|
|
103
112
|
messages: PersonaMessage[];
|
|
104
113
|
};
|
|
@@ -120,7 +129,7 @@ export type PersonaWebRTCConfig = PersonaBaseConfig & {
|
|
|
120
129
|
|
|
121
130
|
export type Session = string | null | undefined;
|
|
122
131
|
|
|
123
|
-
export type MessageListenerCallback = (message:
|
|
132
|
+
export type MessageListenerCallback = (message: PersonaPacket) => void;
|
|
124
133
|
export type StatusChangeCallback = (status: ProtocolStatus) => void;
|
|
125
134
|
|
|
126
135
|
export type ProtocolStatus = 'disconnected' | 'connecting' | 'connected';
|
|
@@ -144,10 +153,10 @@ export interface PersonaProtocol {
|
|
|
144
153
|
|
|
145
154
|
setSession: (session: Session) => Promise<void>;
|
|
146
155
|
|
|
147
|
-
|
|
156
|
+
sendPacket: (packet: PersonaPacket) => Promise<void>;
|
|
148
157
|
clearListeners: () => void;
|
|
149
158
|
addStatusChangeListener: (callback: StatusChangeCallback) => void;
|
|
150
|
-
|
|
159
|
+
addPacketListener: (callback: MessageListenerCallback) => void;
|
|
151
160
|
}
|
|
152
161
|
|
|
153
162
|
export type PersonaConfig = PersonaBaseConfig &
|
|
@@ -159,6 +168,7 @@ export type PersonaConfig = PersonaBaseConfig &
|
|
|
159
168
|
dev?: boolean;
|
|
160
169
|
session?: Session;
|
|
161
170
|
children: ReactNode;
|
|
171
|
+
context?: PersonaAgentContext;
|
|
162
172
|
protocols:
|
|
163
173
|
| PersonaProtocol[]
|
|
164
174
|
| {
|