@radaros/transport 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +10 -2
- package/dist/index.js +119 -0
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Agent, Team, Workflow, A2AAgentCard } from '@radaros/core';
|
|
1
|
+
import { Agent, Team, Workflow, VoiceAgent, A2AAgentCard } from '@radaros/core';
|
|
2
2
|
|
|
3
3
|
interface FileUploadOptions {
|
|
4
4
|
maxFileSize?: number;
|
|
@@ -79,6 +79,14 @@ interface GatewayOptions {
|
|
|
79
79
|
|
|
80
80
|
declare function createAgentGateway(opts: GatewayOptions): void;
|
|
81
81
|
|
|
82
|
+
interface VoiceGatewayOptions {
|
|
83
|
+
agents: Record<string, VoiceAgent>;
|
|
84
|
+
io: any;
|
|
85
|
+
namespace?: string;
|
|
86
|
+
authMiddleware?: (socket: any, next: (err?: Error) => void) => void;
|
|
87
|
+
}
|
|
88
|
+
declare function createVoiceGateway(opts: VoiceGatewayOptions): void;
|
|
89
|
+
|
|
82
90
|
interface A2AServerOptions {
|
|
83
91
|
agents: Record<string, Agent>;
|
|
84
92
|
basePath?: string;
|
|
@@ -113,4 +121,4 @@ declare function generateMultiAgentCard(agents: Record<string, Agent>, serverUrl
|
|
|
113
121
|
url?: string;
|
|
114
122
|
}, version?: string): A2AAgentCard;
|
|
115
123
|
|
|
116
|
-
export { type A2AServerOptions, type FileUploadOptions, type GatewayOptions, type RouterOptions, type SwaggerOptions, buildMultiModalInput, createA2AServer, createAgentGateway, createAgentRouter, createFileUploadMiddleware, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
|
|
124
|
+
export { type A2AServerOptions, type FileUploadOptions, type GatewayOptions, type RouterOptions, type SwaggerOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAgentGateway, createAgentRouter, createFileUploadMiddleware, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
|
package/dist/index.js
CHANGED
|
@@ -767,6 +767,124 @@ function createAgentGateway(opts) {
|
|
|
767
767
|
});
|
|
768
768
|
}
|
|
769
769
|
|
|
770
|
+
// src/socketio/voice-gateway.ts
|
|
771
|
+
function createVoiceGateway(opts) {
|
|
772
|
+
const ns = opts.io.of(opts.namespace ?? "/radaros-voice");
|
|
773
|
+
if (opts.authMiddleware) {
|
|
774
|
+
ns.use(opts.authMiddleware);
|
|
775
|
+
}
|
|
776
|
+
const activeSessions = /* @__PURE__ */ new Map();
|
|
777
|
+
ns.on("connection", (socket) => {
|
|
778
|
+
socket.on(
|
|
779
|
+
"voice.start",
|
|
780
|
+
async (data) => {
|
|
781
|
+
const agent = opts.agents[data.agentName];
|
|
782
|
+
if (!agent) {
|
|
783
|
+
socket.emit("voice.error", {
|
|
784
|
+
error: `Voice agent "${data.agentName}" not found`
|
|
785
|
+
});
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
if (activeSessions.has(socket.id)) {
|
|
789
|
+
socket.emit("voice.error", {
|
|
790
|
+
error: "A voice session is already active for this connection"
|
|
791
|
+
});
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
try {
|
|
795
|
+
const apiKey = data.apiKey ?? socket.handshake?.auth?.apiKey;
|
|
796
|
+
const userId = data.userId ?? socket.handshake?.auth?.userId;
|
|
797
|
+
const sessionId = data.sessionId ?? socket.handshake?.auth?.sessionId;
|
|
798
|
+
const session = await agent.connect({
|
|
799
|
+
apiKey,
|
|
800
|
+
userId,
|
|
801
|
+
sessionId
|
|
802
|
+
});
|
|
803
|
+
activeSessions.set(socket.id, session);
|
|
804
|
+
session.on("audio", (ev) => {
|
|
805
|
+
socket.emit("voice.audio", {
|
|
806
|
+
data: ev.data.toString("base64"),
|
|
807
|
+
mimeType: ev.mimeType ?? "audio/pcm"
|
|
808
|
+
});
|
|
809
|
+
});
|
|
810
|
+
session.on("transcript", (ev) => {
|
|
811
|
+
socket.emit("voice.transcript", {
|
|
812
|
+
text: ev.text,
|
|
813
|
+
role: ev.role
|
|
814
|
+
});
|
|
815
|
+
});
|
|
816
|
+
session.on("text", (ev) => {
|
|
817
|
+
socket.emit("voice.text", { text: ev.text });
|
|
818
|
+
});
|
|
819
|
+
session.on(
|
|
820
|
+
"tool_call_start",
|
|
821
|
+
(ev) => {
|
|
822
|
+
socket.emit("voice.tool.call", {
|
|
823
|
+
name: ev.name,
|
|
824
|
+
args: ev.args
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
);
|
|
828
|
+
session.on(
|
|
829
|
+
"tool_result",
|
|
830
|
+
(ev) => {
|
|
831
|
+
socket.emit("voice.tool.result", {
|
|
832
|
+
name: ev.name,
|
|
833
|
+
result: ev.result
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
);
|
|
837
|
+
session.on("interrupted", () => {
|
|
838
|
+
socket.emit("voice.interrupted");
|
|
839
|
+
});
|
|
840
|
+
session.on("error", (ev) => {
|
|
841
|
+
socket.emit("voice.error", { error: ev.error.message });
|
|
842
|
+
});
|
|
843
|
+
session.on("disconnected", () => {
|
|
844
|
+
activeSessions.delete(socket.id);
|
|
845
|
+
socket.emit("voice.stopped");
|
|
846
|
+
});
|
|
847
|
+
socket.emit("voice.started", { userId });
|
|
848
|
+
} catch (error) {
|
|
849
|
+
socket.emit("voice.error", { error: error.message });
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
);
|
|
853
|
+
socket.on("voice.audio", (data) => {
|
|
854
|
+
const session = activeSessions.get(socket.id);
|
|
855
|
+
if (!session) return;
|
|
856
|
+
session.sendAudio(Buffer.from(data.data, "base64"));
|
|
857
|
+
});
|
|
858
|
+
socket.on("voice.text", (data) => {
|
|
859
|
+
const session = activeSessions.get(socket.id);
|
|
860
|
+
if (!session) return;
|
|
861
|
+
session.sendText(data.text);
|
|
862
|
+
});
|
|
863
|
+
socket.on("voice.interrupt", () => {
|
|
864
|
+
const session = activeSessions.get(socket.id);
|
|
865
|
+
if (!session) return;
|
|
866
|
+
session.interrupt();
|
|
867
|
+
});
|
|
868
|
+
socket.on("voice.stop", async () => {
|
|
869
|
+
const session = activeSessions.get(socket.id);
|
|
870
|
+
if (!session) return;
|
|
871
|
+
await session.close();
|
|
872
|
+
activeSessions.delete(socket.id);
|
|
873
|
+
socket.emit("voice.stopped");
|
|
874
|
+
});
|
|
875
|
+
socket.on("disconnect", async () => {
|
|
876
|
+
const session = activeSessions.get(socket.id);
|
|
877
|
+
if (session) {
|
|
878
|
+
try {
|
|
879
|
+
await session.close();
|
|
880
|
+
} catch {
|
|
881
|
+
}
|
|
882
|
+
activeSessions.delete(socket.id);
|
|
883
|
+
}
|
|
884
|
+
});
|
|
885
|
+
});
|
|
886
|
+
}
|
|
887
|
+
|
|
770
888
|
// src/a2a/a2a-server.ts
|
|
771
889
|
import { createRequire as createRequire4 } from "module";
|
|
772
890
|
import { randomUUID } from "crypto";
|
|
@@ -1119,6 +1237,7 @@ export {
|
|
|
1119
1237
|
createAgentGateway,
|
|
1120
1238
|
createAgentRouter,
|
|
1121
1239
|
createFileUploadMiddleware,
|
|
1240
|
+
createVoiceGateway,
|
|
1122
1241
|
errorHandler,
|
|
1123
1242
|
generateAgentCard,
|
|
1124
1243
|
generateMultiAgentCard,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@radaros/transport",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"typescript": "^5.6.0"
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
|
-
"@radaros/core": "^0.3.
|
|
27
|
+
"@radaros/core": "^0.3.7",
|
|
28
28
|
"@types/express": "^4.0.0 || ^5.0.0",
|
|
29
29
|
"express": "^4.0.0 || ^5.0.0",
|
|
30
30
|
"multer": ">=1.4.0",
|