@assemblyline-agents/livekit 0.1.0 → 2.0.0
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/README.md
CHANGED
|
@@ -12,7 +12,7 @@ npm install @assemblyline-agents/livekit
|
|
|
12
12
|
|
|
13
13
|
## Part of Assembly Line
|
|
14
14
|
|
|
15
|
-
This package is part of [Assembly Line](https://github.com/jasonbadeaux/
|
|
15
|
+
This package is part of [Assembly Line](https://github.com/jasonbadeaux/assembly-line), a vendor-neutral, filesystem-first framework for durable AI agents. See the developer documentation in [docs/developers/](https://github.com/jasonbadeaux/assembly-line/tree/main/docs/developers) for setup, agent authoring, and deployment guides.
|
|
16
16
|
|
|
17
17
|
## License
|
|
18
18
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assemblyline-agents/livekit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -9,10 +9,10 @@
|
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@assemblyline-agents/core": "0.
|
|
13
|
-
"@assemblyline-agents/runtime": "0.
|
|
12
|
+
"@assemblyline-agents/core": "2.0.0",
|
|
13
|
+
"@assemblyline-agents/runtime": "2.0.0"
|
|
14
14
|
},
|
|
15
|
-
"description": "Official
|
|
15
|
+
"description": "Official Assembly Line LiveKit voice, telephony, and agent-dispatch plugin.",
|
|
16
16
|
"files": [
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
@@ -22,16 +22,16 @@
|
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"repository": {
|
|
24
24
|
"type": "git",
|
|
25
|
-
"url": "git+https://github.com/jasonbadeaux/
|
|
25
|
+
"url": "git+https://github.com/jasonbadeaux/assembly-line.git",
|
|
26
26
|
"directory": "capabilities/livekit"
|
|
27
27
|
},
|
|
28
28
|
"bugs": {
|
|
29
|
-
"url": "https://github.com/jasonbadeaux/
|
|
29
|
+
"url": "https://github.com/jasonbadeaux/assembly-line/issues"
|
|
30
30
|
},
|
|
31
|
-
"homepage": "https://github.com/jasonbadeaux/
|
|
32
|
-
"author": "
|
|
31
|
+
"homepage": "https://github.com/jasonbadeaux/assembly-line#readme",
|
|
32
|
+
"author": "Assembly Line contributors",
|
|
33
33
|
"keywords": [
|
|
34
|
-
"
|
|
34
|
+
"assembly-line",
|
|
35
35
|
"ai",
|
|
36
36
|
"agents",
|
|
37
37
|
"livekit",
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { AdapterProviderMetadata, ProviderModule } from "@openeve/core";
|
|
2
|
-
import type { SubagentHarness } from "@openeve/runtime";
|
|
3
|
-
import { type LiveKitVoiceSubagentHarnessOptions } from "./types.js";
|
|
4
|
-
export declare function liveKitVoiceSubagentHarness(options?: LiveKitVoiceSubagentHarnessOptions): SubagentHarness;
|
|
5
|
-
/** Metadata owned by this package; the core registry mirrors it as an offline default. */
|
|
6
|
-
export declare const LIVEKIT_SUBAGENT_PROVIDER_METADATA: AdapterProviderMetadata;
|
|
7
|
-
export declare const openeveProvider: ProviderModule;
|
|
8
|
-
//# sourceMappingURL=subagent-harness.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-harness.d.ts","sourceRoot":"","sources":["../src/subagent-harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAc,cAAc,EAAE,MAAM,eAAe,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAuD,MAAM,kBAAkB,CAAC;AAE7G,OAAO,EAKL,KAAK,kCAAkC,EACxC,MAAM,YAAY,CAAC;AAGpB,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,kCAAuC,GAAG,eAAe,CAE7G;AAED,0FAA0F;AAC1F,eAAO,MAAM,kCAAkC,EAAE,uBAQhD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC"}
|
package/dist/subagent-harness.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { createLiveKitClient } from "./client.js";
|
|
2
|
-
import { LIVEKIT_OPTIONAL_ENV, LIVEKIT_REQUIRED_ENV } from "./types.js";
|
|
3
|
-
import { booleanFrom, compactJsonObject, generatedRoomName, isJsonObject, processEnv, publicJson, recordValue, stringFrom, stringValue, valueAt } from "./util.js";
|
|
4
|
-
export function liveKitVoiceSubagentHarness(options = {}) {
|
|
5
|
-
return new LiveKitVoiceSubagentHarness(options);
|
|
6
|
-
}
|
|
7
|
-
/** Metadata owned by this package; the core registry mirrors it as an offline default. */
|
|
8
|
-
export const LIVEKIT_SUBAGENT_PROVIDER_METADATA = {
|
|
9
|
-
kind: "livekit",
|
|
10
|
-
role: "subagent",
|
|
11
|
-
stability: "preview",
|
|
12
|
-
packageName: "@openeve/livekit",
|
|
13
|
-
requiredEnv: [...LIVEKIT_REQUIRED_ENV],
|
|
14
|
-
optionalEnv: [...LIVEKIT_OPTIONAL_ENV],
|
|
15
|
-
capabilities: ["external-session", "voice-agent", "phone-call", "sip", "agent-dispatch"]
|
|
16
|
-
};
|
|
17
|
-
export const openeveProvider = {
|
|
18
|
-
providers: [
|
|
19
|
-
{
|
|
20
|
-
metadata: LIVEKIT_SUBAGENT_PROVIDER_METADATA,
|
|
21
|
-
create: (ctx) => liveKitVoiceSubagentHarness({ env: ctx.env, fetch: ctx.fetch })
|
|
22
|
-
}
|
|
23
|
-
]
|
|
24
|
-
};
|
|
25
|
-
class LiveKitVoiceSubagentHarness {
|
|
26
|
-
options;
|
|
27
|
-
constructor(options = {}) {
|
|
28
|
-
this.options = options;
|
|
29
|
-
}
|
|
30
|
-
async start(input) {
|
|
31
|
-
const harnessOptions = recordValue(input.subagent.harness.options) ?? {};
|
|
32
|
-
const task = input.task;
|
|
33
|
-
const env = { ...processEnv(), ...(this.options.env ?? {}) };
|
|
34
|
-
const clientOptions = { env };
|
|
35
|
-
if (this.options.fetch)
|
|
36
|
-
clientOptions.fetch = this.options.fetch;
|
|
37
|
-
if (this.options.now)
|
|
38
|
-
clientOptions.now = this.options.now;
|
|
39
|
-
const client = createLiveKitClient(clientOptions);
|
|
40
|
-
const roomName = stringFrom(task, "roomName", "room") ??
|
|
41
|
-
stringFrom(harnessOptions, "roomName", "room") ??
|
|
42
|
-
generatedRoomName(stringFrom(harnessOptions, "roomPrefix") ?? "openeve-voice", input.childRun.id);
|
|
43
|
-
const phoneNumber = stringFrom(task, "phoneNumber", "phone_number", "to");
|
|
44
|
-
const agentName = stringFrom(task, "agentName", "agent_name") ??
|
|
45
|
-
stringFrom(harnessOptions, "agentName", "agent_name") ??
|
|
46
|
-
env.LIVEKIT_VOICE_AGENT_NAME;
|
|
47
|
-
const outboundTrunkId = stringFrom(task, "outboundTrunkId", "outbound_trunk_id", "sipTrunkId", "sip_trunk_id") ??
|
|
48
|
-
stringFrom(harnessOptions, "outboundTrunkId", "outbound_trunk_id", "sipTrunkId", "sip_trunk_id") ??
|
|
49
|
-
env.LIVEKIT_OUTBOUND_TRUNK_ID;
|
|
50
|
-
if (!agentName && !phoneNumber) {
|
|
51
|
-
throw new Error("LiveKit voice subagents require an agentName to dispatch, a phoneNumber to call, or both.");
|
|
52
|
-
}
|
|
53
|
-
const dispatchMetadata = metadataFromTask(input);
|
|
54
|
-
await input.emit({ type: "progress", title: "livekit.voice_session.starting", data: { roomName, agentName: agentName ?? null, outboundCall: Boolean(phoneNumber) } });
|
|
55
|
-
const dispatch = agentName
|
|
56
|
-
? await client.createDispatch({ roomName, agentName, metadata: dispatchMetadata })
|
|
57
|
-
: undefined;
|
|
58
|
-
let participant;
|
|
59
|
-
if (phoneNumber) {
|
|
60
|
-
const sipInput = {
|
|
61
|
-
phoneNumber,
|
|
62
|
-
roomName,
|
|
63
|
-
participantIdentity: stringFrom(task, "participantIdentity", "participant_identity") ?? phoneNumber,
|
|
64
|
-
participantMetadata: { openeve_child_run_id: input.childRun.id, openeve_parent_run_id: input.parentRun.id },
|
|
65
|
-
waitUntilAnswered: booleanFrom(task, "waitUntilAnswered", "wait_until_answered") ??
|
|
66
|
-
booleanFrom(harnessOptions, "waitUntilAnswered", "wait_until_answered") ??
|
|
67
|
-
true
|
|
68
|
-
};
|
|
69
|
-
if (outboundTrunkId)
|
|
70
|
-
sipInput.outboundTrunkId = outboundTrunkId;
|
|
71
|
-
const participantName = stringFrom(task, "participantName", "participant_name");
|
|
72
|
-
const dtmf = stringFrom(task, "dtmf");
|
|
73
|
-
const krispEnabled = booleanFrom(task, "krispEnabled", "krisp_enabled");
|
|
74
|
-
const displayName = stringFrom(task, "displayName", "display_name");
|
|
75
|
-
if (participantName)
|
|
76
|
-
sipInput.participantName = participantName;
|
|
77
|
-
if (dtmf)
|
|
78
|
-
sipInput.dtmf = dtmf;
|
|
79
|
-
if (krispEnabled !== undefined)
|
|
80
|
-
sipInput.krispEnabled = krispEnabled;
|
|
81
|
-
if (displayName)
|
|
82
|
-
sipInput.displayName = displayName;
|
|
83
|
-
participant = await client.createSipParticipant(sipInput);
|
|
84
|
-
}
|
|
85
|
-
const state = {
|
|
86
|
-
adapter: "livekit",
|
|
87
|
-
externalSessionId: stringValue(dispatch?.id) ?? stringValue(participant?.sip_call_id) ?? roomName,
|
|
88
|
-
status: "completed",
|
|
89
|
-
metadata: publicJson(compactJsonObject({
|
|
90
|
-
roomName,
|
|
91
|
-
agentName,
|
|
92
|
-
dispatchId: stringValue(dispatch?.id),
|
|
93
|
-
participantIdentity: stringValue(participant?.participant_identity),
|
|
94
|
-
sipCallId: stringValue(participant?.sip_call_id),
|
|
95
|
-
outboundCall: Boolean(phoneNumber)
|
|
96
|
-
}))
|
|
97
|
-
};
|
|
98
|
-
await input.checkpoint(state);
|
|
99
|
-
const completedEvent = {
|
|
100
|
-
type: "completed",
|
|
101
|
-
summary: `LiveKit voice session started in ${roomName}.`
|
|
102
|
-
};
|
|
103
|
-
if (state.metadata)
|
|
104
|
-
completedEvent.result = state.metadata;
|
|
105
|
-
await input.emit(completedEvent);
|
|
106
|
-
return {
|
|
107
|
-
status: "completed",
|
|
108
|
-
response: `LiveKit voice session started in ${roomName}.`,
|
|
109
|
-
summary: `LiveKit voice session started in ${roomName}.`,
|
|
110
|
-
state
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
function metadataFromTask(input) {
|
|
115
|
-
const metadata = valueAt(input.task, "metadata");
|
|
116
|
-
const base = isJsonObject(metadata) ? metadata : {};
|
|
117
|
-
return compactJsonObject({
|
|
118
|
-
...base,
|
|
119
|
-
phone_number: stringFrom(input.task, "phoneNumber", "phone_number", "to"),
|
|
120
|
-
openeve_parent_run_id: input.parentRun.id,
|
|
121
|
-
openeve_child_run_id: input.childRun.id,
|
|
122
|
-
openeve_subagent: input.subagent.name,
|
|
123
|
-
openeve_task: publicJson(input.task)
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=subagent-harness.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-harness.js","sourceRoot":"","sources":["../src/subagent-harness.ts"],"names":[],"mappings":"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"}
|