@sahab-platform/agents 0.0.3 → 0.0.4
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/_internal-agent.cjs +84 -0
- package/dist/_internal-agent.cjs.map +1 -0
- package/dist/_internal-agent.js +15 -38
- package/dist/_internal-agent.js.map +1 -1
- package/dist/{agent-instructions.mjs → agent-instructions.cjs} +7 -5
- package/dist/agent-instructions.cjs.map +1 -0
- package/dist/agent-instructions.js +3 -5
- package/dist/agent-instructions.js.map +1 -1
- package/dist/{index.mjs → index.cjs} +36 -8
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.mts → index.d.cts} +1 -1
- package/dist/index.js +8 -31
- package/dist/index.js.map +1 -1
- package/dist/{store.mjs → store.cjs} +8 -3
- package/dist/store.cjs.map +1 -0
- package/dist/{store.d.mts → store.d.cts} +1 -1
- package/dist/store.js +1 -6
- package/dist/store.js.map +1 -1
- package/package.json +2 -1
- package/dist/_internal-agent.mjs +0 -61
- package/dist/_internal-agent.mjs.map +0 -1
- package/dist/agent-instructions.mjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/store.mjs.map +0 -1
- /package/dist/{_internal-agent.d.mts → _internal-agent.d.cts} +0 -0
- /package/dist/{agent-instructions.d.mts → agent-instructions.d.cts} +0 -0
- /package/dist/{types-BbAGABHE.d.mts → types-BbAGABHE.d.cts} +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var agents = require('@livekit/agents');
|
|
4
|
+
var livekit = require('@livekit/agents-plugin-livekit');
|
|
5
|
+
var silero = require('@livekit/agents-plugin-silero');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var livekit__namespace = /*#__PURE__*/_interopNamespace(livekit);
|
|
26
|
+
var silero__namespace = /*#__PURE__*/_interopNamespace(silero);
|
|
27
|
+
|
|
28
|
+
// src/_internal-agent.ts
|
|
29
|
+
var Agent = class extends agents.voice.Agent {
|
|
30
|
+
constructor(metadata) {
|
|
31
|
+
const data = JSON.parse(metadata);
|
|
32
|
+
super({
|
|
33
|
+
instructions: "You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\n" + data.prompt
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function getOptions() {
|
|
38
|
+
{
|
|
39
|
+
throw new Error(
|
|
40
|
+
"SahabAgents options have not been set. Call initialize() first."
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/_internal-agent.ts
|
|
46
|
+
var options = getOptions();
|
|
47
|
+
var internal_agent_default = agents.defineAgent({
|
|
48
|
+
prewarm: async (proc) => {
|
|
49
|
+
proc.userData.vad = await silero__namespace.VAD.load();
|
|
50
|
+
},
|
|
51
|
+
entry: async (ctx) => {
|
|
52
|
+
const metadata = JSON.parse(ctx.job.metadata);
|
|
53
|
+
const session = new agents.voice.AgentSession({
|
|
54
|
+
stt: new agents.inference.STT(options.stt),
|
|
55
|
+
llm: new agents.inference.LLM(options.llm),
|
|
56
|
+
tts: new agents.inference.TTS(options.tts),
|
|
57
|
+
turnDetection: new livekit__namespace.turnDetector.MultilingualModel(),
|
|
58
|
+
vad: ctx.proc.userData.vad,
|
|
59
|
+
voiceOptions: {
|
|
60
|
+
preemptiveGeneration: true
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const usageCollector = new agents.metrics.UsageCollector();
|
|
64
|
+
session.on(agents.voice.AgentSessionEventTypes.MetricsCollected, (ev) => {
|
|
65
|
+
agents.metrics.logMetrics(ev.metrics);
|
|
66
|
+
usageCollector.collect(ev.metrics);
|
|
67
|
+
});
|
|
68
|
+
const logUsage = async () => {
|
|
69
|
+
const summary = usageCollector.getSummary();
|
|
70
|
+
console.log(`Usage: ${JSON.stringify(summary)}`);
|
|
71
|
+
};
|
|
72
|
+
ctx.addShutdownCallback(logUsage);
|
|
73
|
+
await session.start({
|
|
74
|
+
agent: new Agent(ctx.job.metadata),
|
|
75
|
+
room: ctx.room
|
|
76
|
+
});
|
|
77
|
+
await ctx.connect();
|
|
78
|
+
ctx.room.localParticipant?.updateName(metadata.name);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
module.exports = internal_agent_default;
|
|
83
|
+
//# sourceMappingURL=_internal-agent.cjs.map
|
|
84
|
+
//# sourceMappingURL=_internal-agent.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent-instructions.ts","../src/store.ts","../src/_internal-agent.ts"],"names":["voice","defineAgent","silero","inference","livekit","metrics"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,KAAA,GAAN,cAAoBA,YAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF,CAAA;ACHO,SAAS,UAAA,GAAiC;AAC/C,EAAe;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEF;;;ACGA,IAAM,UAAU,UAAA,EAAW;AAE3B,IAAO,yBAAQC,kBAAA,CAAY;AAAA,EACzB,OAAA,EAAS,OAAO,IAAA,KAAqB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,GAAM,MAAaC,iBAAA,CAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,OAAO,GAAA,KAAoB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,IAAIF,YAAAA,CAAM,YAAA,CAAa;AAAA,MACrC,GAAA,EAAK,IAAIG,gBAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAIA,gBAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAIA,gBAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,aAAA,EAAe,IAAYC,kBAAA,CAAA,YAAA,CAAa,iBAAA,EAAkB;AAAA,MAC1D,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,GAAA;AAAA,MACvB,YAAA,EAAc;AAAA,QACZ,oBAAA,EAAsB;AAAA;AACxB,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,IAAIC,cAAA,CAAQ,cAAA,EAAe;AAClD,IAAA,OAAA,CAAQ,EAAA,CAAGL,YAAAA,CAAM,sBAAA,CAAuB,gBAAA,EAAkB,CAAC,EAAA,KAAO;AAChE,MAAAK,cAAA,CAAQ,UAAA,CAAW,GAAG,OAAO,CAAA;AAC7B,MAAA,cAAA,CAAe,OAAA,CAAQ,GAAG,OAAO,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,MAAM,OAAA,GAAU,eAAe,UAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,GAAA,CAAI,oBAAoB,QAAQ,CAAA;AAEhC,IAAA,MAAM,QAAQ,KAAA,CAAM;AAAA,MAClB,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAAA,MACjC,MAAM,GAAA,CAAI;AAAA,KACX,CAAA;AAED,IAAA,MAAM,IAAI,OAAA,EAAQ;AAElB,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,EAAkB,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA,EACrD;AACF,CAAC","file":"_internal-agent.cjs","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","/**\n * Internal agent entry file — imported by LiveKit's worker process.\n *\n * Do NOT import this file directly. It is referenced by path in\n * `AgentsResource.initialize()` and dynamically loaded by LiveKit.\n */\nimport {\n defineAgent,\n JobContext,\n JobProcess,\n voice,\n metrics,\n inference,\n} from \"@livekit/agents\";\nimport * as livekit from \"@livekit/agents-plugin-livekit\";\nimport * as silero from \"@livekit/agents-plugin-silero\";\nimport { Agent } from \"./agent-instructions.js\";\nimport { getOptions } from \"./store.js\";\n\nconst options = getOptions();\n\nexport default defineAgent({\n prewarm: async (proc: JobProcess) => {\n proc.userData.vad = await silero.VAD.load();\n },\n entry: async (ctx: JobContext) => {\n const metadata = JSON.parse(ctx.job.metadata);\n\n const session = new voice.AgentSession({\n stt: new inference.STT(options.stt),\n llm: new inference.LLM(options.llm),\n tts: new inference.TTS(options.tts),\n turnDetection: new livekit.turnDetector.MultilingualModel(),\n vad: ctx.proc.userData.vad! as silero.VAD,\n voiceOptions: {\n preemptiveGeneration: true,\n },\n });\n\n const usageCollector = new metrics.UsageCollector();\n session.on(voice.AgentSessionEventTypes.MetricsCollected, (ev) => {\n metrics.logMetrics(ev.metrics);\n usageCollector.collect(ev.metrics);\n });\n\n const logUsage = async () => {\n const summary = usageCollector.getSummary();\n console.log(`Usage: ${JSON.stringify(summary)}`);\n };\n\n ctx.addShutdownCallback(logUsage);\n\n await session.start({\n agent: new Agent(ctx.job.metadata),\n room: ctx.room,\n });\n\n await ctx.connect();\n\n ctx.room.localParticipant?.updateName(metadata.name);\n },\n});\n"]}
|
package/dist/_internal-agent.js
CHANGED
|
@@ -1,32 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var livekit = require('@livekit/agents-plugin-livekit');
|
|
5
|
-
var silero = require('@livekit/agents-plugin-silero');
|
|
6
|
-
|
|
7
|
-
function _interopNamespace(e) {
|
|
8
|
-
if (e && e.__esModule) return e;
|
|
9
|
-
var n = Object.create(null);
|
|
10
|
-
if (e) {
|
|
11
|
-
Object.keys(e).forEach(function (k) {
|
|
12
|
-
if (k !== 'default') {
|
|
13
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () { return e[k]; }
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
n.default = e;
|
|
22
|
-
return Object.freeze(n);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var livekit__namespace = /*#__PURE__*/_interopNamespace(livekit);
|
|
26
|
-
var silero__namespace = /*#__PURE__*/_interopNamespace(silero);
|
|
1
|
+
import { voice, defineAgent, inference, metrics } from '@livekit/agents';
|
|
2
|
+
import * as livekit from '@livekit/agents-plugin-livekit';
|
|
3
|
+
import * as silero from '@livekit/agents-plugin-silero';
|
|
27
4
|
|
|
28
5
|
// src/_internal-agent.ts
|
|
29
|
-
var Agent = class extends
|
|
6
|
+
var Agent = class extends voice.Agent {
|
|
30
7
|
constructor(metadata) {
|
|
31
8
|
const data = JSON.parse(metadata);
|
|
32
9
|
super({
|
|
@@ -44,25 +21,25 @@ function getOptions() {
|
|
|
44
21
|
|
|
45
22
|
// src/_internal-agent.ts
|
|
46
23
|
var options = getOptions();
|
|
47
|
-
var internal_agent_default =
|
|
24
|
+
var internal_agent_default = defineAgent({
|
|
48
25
|
prewarm: async (proc) => {
|
|
49
|
-
proc.userData.vad = await
|
|
26
|
+
proc.userData.vad = await silero.VAD.load();
|
|
50
27
|
},
|
|
51
28
|
entry: async (ctx) => {
|
|
52
29
|
const metadata = JSON.parse(ctx.job.metadata);
|
|
53
|
-
const session = new
|
|
54
|
-
stt: new
|
|
55
|
-
llm: new
|
|
56
|
-
tts: new
|
|
57
|
-
turnDetection: new
|
|
30
|
+
const session = new voice.AgentSession({
|
|
31
|
+
stt: new inference.STT(options.stt),
|
|
32
|
+
llm: new inference.LLM(options.llm),
|
|
33
|
+
tts: new inference.TTS(options.tts),
|
|
34
|
+
turnDetection: new livekit.turnDetector.MultilingualModel(),
|
|
58
35
|
vad: ctx.proc.userData.vad,
|
|
59
36
|
voiceOptions: {
|
|
60
37
|
preemptiveGeneration: true
|
|
61
38
|
}
|
|
62
39
|
});
|
|
63
|
-
const usageCollector = new
|
|
64
|
-
session.on(
|
|
65
|
-
|
|
40
|
+
const usageCollector = new metrics.UsageCollector();
|
|
41
|
+
session.on(voice.AgentSessionEventTypes.MetricsCollected, (ev) => {
|
|
42
|
+
metrics.logMetrics(ev.metrics);
|
|
66
43
|
usageCollector.collect(ev.metrics);
|
|
67
44
|
});
|
|
68
45
|
const logUsage = async () => {
|
|
@@ -79,6 +56,6 @@ var internal_agent_default = agents.defineAgent({
|
|
|
79
56
|
}
|
|
80
57
|
});
|
|
81
58
|
|
|
82
|
-
|
|
59
|
+
export { internal_agent_default as default };
|
|
83
60
|
//# sourceMappingURL=_internal-agent.js.map
|
|
84
61
|
//# sourceMappingURL=_internal-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent-instructions.ts","../src/store.ts","../src/_internal-agent.ts"],"names":["voice"
|
|
1
|
+
{"version":3,"sources":["../src/agent-instructions.ts","../src/store.ts","../src/_internal-agent.ts"],"names":["voice"],"mappings":";;;;;AAEO,IAAM,KAAA,GAAN,cAAoB,KAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF,CAAA;ACHO,SAAS,UAAA,GAAiC;AAC/C,EAAe;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEF;;;ACGA,IAAM,UAAU,UAAA,EAAW;AAE3B,IAAO,yBAAQ,WAAA,CAAY;AAAA,EACzB,OAAA,EAAS,OAAO,IAAA,KAAqB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,GAAM,MAAa,MAAA,CAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,OAAO,GAAA,KAAoB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,IAAIA,KAAAA,CAAM,YAAA,CAAa;AAAA,MACrC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,aAAA,EAAe,IAAY,OAAA,CAAA,YAAA,CAAa,iBAAA,EAAkB;AAAA,MAC1D,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,GAAA;AAAA,MACvB,YAAA,EAAc;AAAA,QACZ,oBAAA,EAAsB;AAAA;AACxB,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAQ,cAAA,EAAe;AAClD,IAAA,OAAA,CAAQ,EAAA,CAAGA,KAAAA,CAAM,sBAAA,CAAuB,gBAAA,EAAkB,CAAC,EAAA,KAAO;AAChE,MAAA,OAAA,CAAQ,UAAA,CAAW,GAAG,OAAO,CAAA;AAC7B,MAAA,cAAA,CAAe,OAAA,CAAQ,GAAG,OAAO,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,MAAM,OAAA,GAAU,eAAe,UAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,GAAA,CAAI,oBAAoB,QAAQ,CAAA;AAEhC,IAAA,MAAM,QAAQ,KAAA,CAAM;AAAA,MAClB,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAAA,MACjC,MAAM,GAAA,CAAI;AAAA,KACX,CAAA;AAED,IAAA,MAAM,IAAI,OAAA,EAAQ;AAElB,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,EAAkB,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA,EACrD;AACF,CAAC","file":"_internal-agent.js","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","/**\n * Internal agent entry file — imported by LiveKit's worker process.\n *\n * Do NOT import this file directly. It is referenced by path in\n * `AgentsResource.initialize()` and dynamically loaded by LiveKit.\n */\nimport {\n defineAgent,\n JobContext,\n JobProcess,\n voice,\n metrics,\n inference,\n} from \"@livekit/agents\";\nimport * as livekit from \"@livekit/agents-plugin-livekit\";\nimport * as silero from \"@livekit/agents-plugin-silero\";\nimport { Agent } from \"./agent-instructions.js\";\nimport { getOptions } from \"./store.js\";\n\nconst options = getOptions();\n\nexport default defineAgent({\n prewarm: async (proc: JobProcess) => {\n proc.userData.vad = await silero.VAD.load();\n },\n entry: async (ctx: JobContext) => {\n const metadata = JSON.parse(ctx.job.metadata);\n\n const session = new voice.AgentSession({\n stt: new inference.STT(options.stt),\n llm: new inference.LLM(options.llm),\n tts: new inference.TTS(options.tts),\n turnDetection: new livekit.turnDetector.MultilingualModel(),\n vad: ctx.proc.userData.vad! as silero.VAD,\n voiceOptions: {\n preemptiveGeneration: true,\n },\n });\n\n const usageCollector = new metrics.UsageCollector();\n session.on(voice.AgentSessionEventTypes.MetricsCollected, (ev) => {\n metrics.logMetrics(ev.metrics);\n usageCollector.collect(ev.metrics);\n });\n\n const logUsage = async () => {\n const summary = usageCollector.getSummary();\n console.log(`Usage: ${JSON.stringify(summary)}`);\n };\n\n ctx.addShutdownCallback(logUsage);\n\n await session.start({\n agent: new Agent(ctx.job.metadata),\n room: ctx.room,\n });\n\n await ctx.connect();\n\n ctx.room.localParticipant?.updateName(metadata.name);\n },\n});\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var agents = require('@livekit/agents');
|
|
2
4
|
|
|
3
5
|
// src/agent-instructions.ts
|
|
4
|
-
var Agent = class extends voice.Agent {
|
|
6
|
+
var Agent = class extends agents.voice.Agent {
|
|
5
7
|
constructor(metadata) {
|
|
6
8
|
const data = JSON.parse(metadata);
|
|
7
9
|
super({
|
|
@@ -10,6 +12,6 @@ var Agent = class extends voice.Agent {
|
|
|
10
12
|
}
|
|
11
13
|
};
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=agent-instructions.
|
|
15
|
-
//# sourceMappingURL=agent-instructions.
|
|
15
|
+
exports.Agent = Agent;
|
|
16
|
+
//# sourceMappingURL=agent-instructions.cjs.map
|
|
17
|
+
//# sourceMappingURL=agent-instructions.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/agent-instructions.ts"],"names":["voice"],"mappings":";;;;;AAEO,IAAM,KAAA,GAAN,cAAoBA,YAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF","file":"agent-instructions.cjs","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n"]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var agents = require('@livekit/agents');
|
|
1
|
+
import { voice } from '@livekit/agents';
|
|
4
2
|
|
|
5
3
|
// src/agent-instructions.ts
|
|
6
|
-
var Agent = class extends
|
|
4
|
+
var Agent = class extends voice.Agent {
|
|
7
5
|
constructor(metadata) {
|
|
8
6
|
const data = JSON.parse(metadata);
|
|
9
7
|
super({
|
|
@@ -12,6 +10,6 @@ var Agent = class extends agents.voice.Agent {
|
|
|
12
10
|
}
|
|
13
11
|
};
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
export { Agent };
|
|
16
14
|
//# sourceMappingURL=agent-instructions.js.map
|
|
17
15
|
//# sourceMappingURL=agent-instructions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent-instructions.ts"],"names":[
|
|
1
|
+
{"version":3,"sources":["../src/agent-instructions.ts"],"names":[],"mappings":";;;AAEO,IAAM,KAAA,GAAN,cAAoB,KAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF","file":"agent-instructions.js","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n"]}
|
|
@@ -1,5 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var agents = require('@livekit/agents');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
var url = require('url');
|
|
6
|
+
|
|
7
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
8
|
+
function _interopNamespace(e) {
|
|
9
|
+
if (e && e.__esModule) return e;
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
3
27
|
|
|
4
28
|
// src/errors.ts
|
|
5
29
|
var SahabAgentsError = class extends Error {
|
|
@@ -114,9 +138,10 @@ var AgentsResource = class {
|
|
|
114
138
|
async initialize() {
|
|
115
139
|
const livekitConfig = await getConfig(this.http);
|
|
116
140
|
setOptions(this.options);
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
141
|
+
const __dirname = path__namespace.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));
|
|
142
|
+
const agentPath = path__namespace.resolve(__dirname, "_internal-agent.js");
|
|
143
|
+
agents.cli.runApp(
|
|
144
|
+
new agents.ServerOptions({
|
|
120
145
|
agent: agentPath,
|
|
121
146
|
agentName: "sahab-agent-" + livekitConfig.id,
|
|
122
147
|
wsURL: livekitConfig.url,
|
|
@@ -136,6 +161,9 @@ var SahabAgents = class {
|
|
|
136
161
|
}
|
|
137
162
|
};
|
|
138
163
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
exports.ApiError = ApiError;
|
|
165
|
+
exports.SahabAgents = SahabAgents;
|
|
166
|
+
exports.SahabAgentsError = SahabAgentsError;
|
|
167
|
+
exports.TimeoutError = TimeoutError;
|
|
168
|
+
//# sourceMappingURL=index.cjs.map
|
|
169
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path","fileURLToPath","cli","ServerOptions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,QAAA,GAAN,cAAuB,gBAAA,CAAiB;AAAA,EACpC,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAET,WAAA,CAAY,QAAgB,IAAA,EAAoB;AAC9C,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AAAA,EACtB;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,gBAAA,CAAiB;AAAA,EACjD,YAAY,SAAA,EAAmB;AAC7B,IAAA,KAAA,CAAM,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAI,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;;;ACzBA,IAAM,eAAA,GAAkB,GAAA;AAEjB,IAAM,aAAN,MAAiB;AAAA,EACL,OAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,OAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,2BAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,eAAA;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ,kBAAA;AAAA,MACR,WAAW,OAAA,CAAQ,MAAA;AAAA,MACnB,GAAG,OAAA,CAAQ;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CACJ,MAAA,EACAA,KAAAA,EACA,OAAA,GAGI,EAAC,EACO;AACZ,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAGA,KAAI,CAAA,CAAE,CAAA;AAE5C,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzD,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAE/D,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,EAAG;AAAA,QACrC,MAAA;AAAA,QACA,SAAS,IAAA,CAAK,cAAA;AAAA,QACd,IAAA,EACE,QAAQ,IAAA,KAAS,KAAA,CAAA,GAAY,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QAC9D,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAM,IAAI,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA;AAAA,MACrC;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,IAAA,GAAqB,EAAE,OAAA,EAAS,QAAA,CAAS,UAAA,EAAW;AACxD,MAAA,IAAI;AACF,QAAA,IAAA,GAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,MAC9B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,IAAI,QAAA,CAAS,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC1C;AAGA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,GAAA,CACEA,OACA,MAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW,KAAA,EAAOA,KAAAA,EAAM,EAAE,QAAQ,CAAA;AAAA,EAChD;AAAA,EAEA,IAAA,CAAQA,OAAc,IAAA,EAA4B;AAChD,IAAA,OAAO,KAAK,OAAA,CAAW,MAAA,EAAQA,KAAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,CAASA,OAAc,IAAA,EAA4B;AACjD,IAAA,OAAO,KAAK,OAAA,CAAW,OAAA,EAASA,KAAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAChD;AAAA,EAEA,OAAUA,KAAAA,EAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAUA,KAAI,CAAA;AAAA,EACvC;AACF,CAAA;;;AC9FA,eAAsB,UAAU,IAAA,EAA0C;AACxE,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAmB,cAAc,CAAA;AAC7D,EAAA,OAAO,QAAA;AACT;ACDO,SAAS,WAAW,OAAA,EAAmC;AAE9D;;;ACCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CACmB,MACA,OAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAEH,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAC/C,IAAA,UAAA,CAAW,KAAK,OAAO,CAAA;AAEvB,IAAA,MAAM,SAAA,GAAiBA,eAAA,CAAA,OAAA,CAAQC,iBAAA,CAAc,2PAAe,CAAC,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAiBD,eAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AAE9D,IAAAE,UAAA,CAAI,MAAA;AAAA,MACF,IAAIC,oBAAA,CAAc;AAAA,QAChB,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW,iBAAiB,aAAA,CAAc,EAAA;AAAA,QAC1C,OAAO,aAAA,CAAc,GAAA;AAAA,QACrB,QAAQ,aAAA,CAAc,MAAA;AAAA,QACtB,WAAW,aAAA,CAAc;AAAA,OAC1B;AAAA,KACH;AAAA,EACF;AACF,CAAA;;;AC3BO,IAAM,cAAN,MAAkB;AAAA,EACd,MAAA;AAAA,EAET,YAAY,OAAA,EAA6B;AACvC,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AACF","file":"index.cjs","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
var path = require('path');
|
|
5
|
-
|
|
6
|
-
function _interopNamespace(e) {
|
|
7
|
-
if (e && e.__esModule) return e;
|
|
8
|
-
var n = Object.create(null);
|
|
9
|
-
if (e) {
|
|
10
|
-
Object.keys(e).forEach(function (k) {
|
|
11
|
-
if (k !== 'default') {
|
|
12
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return e[k]; }
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
n.default = e;
|
|
21
|
-
return Object.freeze(n);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
1
|
+
import { cli, ServerOptions } from '@livekit/agents';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
25
4
|
|
|
26
5
|
// src/errors.ts
|
|
27
6
|
var SahabAgentsError = class extends Error {
|
|
@@ -136,9 +115,10 @@ var AgentsResource = class {
|
|
|
136
115
|
async initialize() {
|
|
137
116
|
const livekitConfig = await getConfig(this.http);
|
|
138
117
|
setOptions(this.options);
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
118
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
119
|
+
const agentPath = path.resolve(__dirname, "_internal-agent.js");
|
|
120
|
+
cli.runApp(
|
|
121
|
+
new ServerOptions({
|
|
142
122
|
agent: agentPath,
|
|
143
123
|
agentName: "sahab-agent-" + livekitConfig.id,
|
|
144
124
|
wsURL: livekitConfig.url,
|
|
@@ -158,9 +138,6 @@ var SahabAgents = class {
|
|
|
158
138
|
}
|
|
159
139
|
};
|
|
160
140
|
|
|
161
|
-
|
|
162
|
-
exports.SahabAgents = SahabAgents;
|
|
163
|
-
exports.SahabAgentsError = SahabAgentsError;
|
|
164
|
-
exports.TimeoutError = TimeoutError;
|
|
141
|
+
export { ApiError, SahabAgents, SahabAgentsError, TimeoutError };
|
|
165
142
|
//# sourceMappingURL=index.js.map
|
|
166
143
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path","cli","ServerOptions"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const __dirname = path.dirname(fileURLToPath(import.meta.url));\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
1
3
|
// src/store.ts
|
|
2
4
|
var _options;
|
|
3
5
|
var _livekitConfig;
|
|
@@ -24,6 +26,9 @@ function getLiveKitConfig() {
|
|
|
24
26
|
return _livekitConfig;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
exports.getLiveKitConfig = getLiveKitConfig;
|
|
30
|
+
exports.getOptions = getOptions;
|
|
31
|
+
exports.setLiveKitConfig = setLiveKitConfig;
|
|
32
|
+
exports.setOptions = setOptions;
|
|
33
|
+
//# sourceMappingURL=store.cjs.map
|
|
34
|
+
//# sourceMappingURL=store.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"names":[],"mappings":";;;AAEA,IAAI,QAAA;AACJ,IAAI,cAAA;AAEG,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,QAAA,GAAW,OAAA;AACb;AAEO,SAAS,UAAA,GAAiC;AAC/C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAA6B;AAC5D,EAAA,cAAA,GAAiB,MAAA;AACnB;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,cAAA;AACT","file":"store.cjs","sourcesContent":["import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LiveKitConfig, S as SahabAgentsOptions } from './types-BbAGABHE.
|
|
1
|
+
import { L as LiveKitConfig, S as SahabAgentsOptions } from './types-BbAGABHE.cjs';
|
|
2
2
|
|
|
3
3
|
declare function setOptions(options: SahabAgentsOptions): void;
|
|
4
4
|
declare function getOptions(): SahabAgentsOptions;
|
package/dist/store.js
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
// src/store.ts
|
|
4
2
|
var _options;
|
|
5
3
|
var _livekitConfig;
|
|
@@ -26,9 +24,6 @@ function getLiveKitConfig() {
|
|
|
26
24
|
return _livekitConfig;
|
|
27
25
|
}
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
exports.getOptions = getOptions;
|
|
31
|
-
exports.setLiveKitConfig = setLiveKitConfig;
|
|
32
|
-
exports.setOptions = setOptions;
|
|
27
|
+
export { getLiveKitConfig, getOptions, setLiveKitConfig, setOptions };
|
|
33
28
|
//# sourceMappingURL=store.js.map
|
|
34
29
|
//# sourceMappingURL=store.js.map
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/store.ts"],"names":[],"mappings":";AAEA,IAAI,QAAA;AACJ,IAAI,cAAA;AAEG,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,QAAA,GAAW,OAAA;AACb;AAEO,SAAS,UAAA,GAAiC;AAC/C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAA6B;AAC5D,EAAA,cAAA,GAAiB,MAAA;AACnB;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,cAAA;AACT","file":"store.js","sourcesContent":["import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sahab-platform/agents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "TypeScript SDK for the Sahab Agents API",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"sdk",
|
|
11
11
|
"api"
|
|
12
12
|
],
|
|
13
|
+
"type": "module",
|
|
13
14
|
"main": "./dist/index.js",
|
|
14
15
|
"module": "./dist/index.mjs",
|
|
15
16
|
"types": "./dist/index.d.ts",
|
package/dist/_internal-agent.mjs
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { voice, defineAgent, inference, metrics } from '@livekit/agents';
|
|
2
|
-
import * as livekit from '@livekit/agents-plugin-livekit';
|
|
3
|
-
import * as silero from '@livekit/agents-plugin-silero';
|
|
4
|
-
|
|
5
|
-
// src/_internal-agent.ts
|
|
6
|
-
var Agent = class extends voice.Agent {
|
|
7
|
-
constructor(metadata) {
|
|
8
|
-
const data = JSON.parse(metadata);
|
|
9
|
-
super({
|
|
10
|
-
instructions: "You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\n" + data.prompt
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
function getOptions() {
|
|
15
|
-
{
|
|
16
|
-
throw new Error(
|
|
17
|
-
"SahabAgents options have not been set. Call initialize() first."
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// src/_internal-agent.ts
|
|
23
|
-
var options = getOptions();
|
|
24
|
-
var internal_agent_default = defineAgent({
|
|
25
|
-
prewarm: async (proc) => {
|
|
26
|
-
proc.userData.vad = await silero.VAD.load();
|
|
27
|
-
},
|
|
28
|
-
entry: async (ctx) => {
|
|
29
|
-
const metadata = JSON.parse(ctx.job.metadata);
|
|
30
|
-
const session = new voice.AgentSession({
|
|
31
|
-
stt: new inference.STT(options.stt),
|
|
32
|
-
llm: new inference.LLM(options.llm),
|
|
33
|
-
tts: new inference.TTS(options.tts),
|
|
34
|
-
turnDetection: new livekit.turnDetector.MultilingualModel(),
|
|
35
|
-
vad: ctx.proc.userData.vad,
|
|
36
|
-
voiceOptions: {
|
|
37
|
-
preemptiveGeneration: true
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
const usageCollector = new metrics.UsageCollector();
|
|
41
|
-
session.on(voice.AgentSessionEventTypes.MetricsCollected, (ev) => {
|
|
42
|
-
metrics.logMetrics(ev.metrics);
|
|
43
|
-
usageCollector.collect(ev.metrics);
|
|
44
|
-
});
|
|
45
|
-
const logUsage = async () => {
|
|
46
|
-
const summary = usageCollector.getSummary();
|
|
47
|
-
console.log(`Usage: ${JSON.stringify(summary)}`);
|
|
48
|
-
};
|
|
49
|
-
ctx.addShutdownCallback(logUsage);
|
|
50
|
-
await session.start({
|
|
51
|
-
agent: new Agent(ctx.job.metadata),
|
|
52
|
-
room: ctx.room
|
|
53
|
-
});
|
|
54
|
-
await ctx.connect();
|
|
55
|
-
ctx.room.localParticipant?.updateName(metadata.name);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
export { internal_agent_default as default };
|
|
60
|
-
//# sourceMappingURL=_internal-agent.mjs.map
|
|
61
|
-
//# sourceMappingURL=_internal-agent.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent-instructions.ts","../src/store.ts","../src/_internal-agent.ts"],"names":["voice"],"mappings":";;;;;AAEO,IAAM,KAAA,GAAN,cAAoB,KAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF,CAAA;ACHO,SAAS,UAAA,GAAiC;AAC/C,EAAe;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEF;;;ACGA,IAAM,UAAU,UAAA,EAAW;AAE3B,IAAO,yBAAQ,WAAA,CAAY;AAAA,EACzB,OAAA,EAAS,OAAO,IAAA,KAAqB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,GAAM,MAAa,MAAA,CAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EAC5C,CAAA;AAAA,EACA,KAAA,EAAO,OAAO,GAAA,KAAoB;AAChC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,IAAIA,KAAAA,CAAM,YAAA,CAAa;AAAA,MACrC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,GAAA,EAAK,IAAI,SAAA,CAAU,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,MAClC,aAAA,EAAe,IAAY,OAAA,CAAA,YAAA,CAAa,iBAAA,EAAkB;AAAA,MAC1D,GAAA,EAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,GAAA;AAAA,MACvB,YAAA,EAAc;AAAA,QACZ,oBAAA,EAAsB;AAAA;AACxB,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAQ,cAAA,EAAe;AAClD,IAAA,OAAA,CAAQ,EAAA,CAAGA,KAAAA,CAAM,sBAAA,CAAuB,gBAAA,EAAkB,CAAC,EAAA,KAAO;AAChE,MAAA,OAAA,CAAQ,UAAA,CAAW,GAAG,OAAO,CAAA;AAC7B,MAAA,cAAA,CAAe,OAAA,CAAQ,GAAG,OAAO,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,MAAM,WAAW,YAAY;AAC3B,MAAA,MAAM,OAAA,GAAU,eAAe,UAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,IAAI,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,GAAA,CAAI,oBAAoB,QAAQ,CAAA;AAEhC,IAAA,MAAM,QAAQ,KAAA,CAAM;AAAA,MAClB,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,QAAQ,CAAA;AAAA,MACjC,MAAM,GAAA,CAAI;AAAA,KACX,CAAA;AAED,IAAA,MAAM,IAAI,OAAA,EAAQ;AAElB,IAAA,GAAA,CAAI,IAAA,CAAK,gBAAA,EAAkB,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA,EACrD;AACF,CAAC","file":"_internal-agent.mjs","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","/**\n * Internal agent entry file — imported by LiveKit's worker process.\n *\n * Do NOT import this file directly. It is referenced by path in\n * `AgentsResource.initialize()` and dynamically loaded by LiveKit.\n */\nimport {\n defineAgent,\n JobContext,\n JobProcess,\n voice,\n metrics,\n inference,\n} from \"@livekit/agents\";\nimport * as livekit from \"@livekit/agents-plugin-livekit\";\nimport * as silero from \"@livekit/agents-plugin-silero\";\nimport { Agent } from \"./agent-instructions.js\";\nimport { getOptions } from \"./store.js\";\n\nconst options = getOptions();\n\nexport default defineAgent({\n prewarm: async (proc: JobProcess) => {\n proc.userData.vad = await silero.VAD.load();\n },\n entry: async (ctx: JobContext) => {\n const metadata = JSON.parse(ctx.job.metadata);\n\n const session = new voice.AgentSession({\n stt: new inference.STT(options.stt),\n llm: new inference.LLM(options.llm),\n tts: new inference.TTS(options.tts),\n turnDetection: new livekit.turnDetector.MultilingualModel(),\n vad: ctx.proc.userData.vad! as silero.VAD,\n voiceOptions: {\n preemptiveGeneration: true,\n },\n });\n\n const usageCollector = new metrics.UsageCollector();\n session.on(voice.AgentSessionEventTypes.MetricsCollected, (ev) => {\n metrics.logMetrics(ev.metrics);\n usageCollector.collect(ev.metrics);\n });\n\n const logUsage = async () => {\n const summary = usageCollector.getSummary();\n console.log(`Usage: ${JSON.stringify(summary)}`);\n };\n\n ctx.addShutdownCallback(logUsage);\n\n await session.start({\n agent: new Agent(ctx.job.metadata),\n room: ctx.room,\n });\n\n await ctx.connect();\n\n ctx.room.localParticipant?.updateName(metadata.name);\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/agent-instructions.ts"],"names":[],"mappings":";;;AAEO,IAAM,KAAA,GAAN,cAAoB,KAAA,CAAM,KAAA,CAAM;AAAA,EACrC,YAAY,QAAA,EAAkB;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,KAAA,CAAM;AAAA,MACJ,YAAA,EACE,uIAEA,IAAA,CAAK;AAAA,KACR,CAAA;AAAA,EACH;AACF","file":"agent-instructions.mjs","sourcesContent":["import { voice } from \"@livekit/agents\";\n\nexport class Agent extends voice.Agent {\n constructor(metadata: string) {\n const data = JSON.parse(metadata);\n super({\n instructions:\n \"You are a helpful voice AI assistant. The user is interacting with you via voice, even if you perceive the conversation as text.\" +\n \"\\n\" +\n data.prompt,\n });\n }\n}\n"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/utils/get-config.utils.ts","../src/store.ts","../src/resources/agents.ts","../src/index.ts"],"names":["path"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\n\nexport class SahabAgentsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SahabAgentsError\";\n }\n}\n\nexport class ApiError extends SahabAgentsError {\n readonly status: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(status: number, body: ApiErrorBody) {\n super(body.message);\n this.name = \"ApiError\";\n this.status = status;\n this.code = body.code;\n this.details = body.details;\n }\n}\n\nexport class TimeoutError extends SahabAgentsError {\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n","import { ApiError, TimeoutError } from \"./errors.js\";\nimport type { ApiErrorBody, SahabAgentsOptions } from \"./types.js\";\n\nconst DEFAULT_TIMEOUT = 30_000;\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeout: number;\n\n constructor(options: SahabAgentsOptions) {\n this.baseUrl = \"https://api.sahab.live/v1\";\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.defaultHeaders = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"api-key\": options.apiKey,\n ...options.headers,\n };\n }\n\n async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n\n if (options.params) {\n for (const [key, value] of Object.entries(options.params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n let response: Response;\n\n try {\n response = await fetch(url.toString(), {\n method,\n headers: this.defaultHeaders,\n body:\n options.body !== undefined ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new TimeoutError(this.timeout);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n if (!response.ok) {\n let body: ApiErrorBody = { message: response.statusText };\n try {\n body = (await response.json()) as ApiErrorBody;\n } catch {\n // use default body\n }\n throw new ApiError(response.status, body);\n }\n\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n\n get<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n ): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import { HttpClient } from \"../client.js\";\nimport type { LiveKitConfig } from \"../types.js\";\n\nexport async function getConfig(http: HttpClient): Promise<LiveKitConfig> {\n const response = await http.get<LiveKitConfig>(\"/auth/config\");\n return response;\n}\n","import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n","import { cli, ServerOptions } from \"@livekit/agents\";\nimport * as path from \"path\";\nimport type { HttpClient } from \"../client.js\";\nimport type { SahabAgentsOptions } from \"../types.js\";\nimport { getConfig } from \"../utils/get-config.utils.js\";\nimport { setOptions, setLiveKitConfig } from \"../store.js\";\n\nexport class AgentsResource {\n constructor(\n private readonly http: HttpClient,\n private readonly options: SahabAgentsOptions,\n ) {}\n\n async initialize(): Promise<void> {\n const livekitConfig = await getConfig(this.http);\n setOptions(this.options);\n setLiveKitConfig(livekitConfig);\n const agentPath = path.resolve(__dirname, \"_internal-agent.js\");\n\n cli.runApp(\n new ServerOptions({\n agent: agentPath,\n agentName: \"sahab-agent-\" + livekitConfig.id,\n wsURL: livekitConfig.url,\n apiKey: livekitConfig.apiKey,\n apiSecret: livekitConfig.apiSecret,\n }),\n );\n }\n}\n","import { HttpClient } from \"./client.js\";\nimport { AgentsResource } from \"./resources/agents.js\";\nimport type { SahabAgentsOptions } from \"./types.js\";\n\nexport class SahabAgents {\n readonly agents: AgentsResource;\n\n constructor(options: SahabAgentsOptions) {\n const http = new HttpClient(options);\n this.agents = new AgentsResource(http, options);\n }\n}\n\nexport type { SahabAgentsOptions } from \"./types.js\";\n\nexport { ApiError, SahabAgentsError, TimeoutError } from \"./errors.js\";\n"]}
|
package/dist/store.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store.ts"],"names":[],"mappings":";AAEA,IAAI,QAAA;AACJ,IAAI,cAAA;AAEG,SAAS,WAAW,OAAA,EAAmC;AAC5D,EAAA,QAAA,GAAW,OAAA;AACb;AAEO,SAAS,UAAA,GAAiC;AAC/C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAA6B;AAC5D,EAAA,cAAA,GAAiB,MAAA;AACnB;AAEO,SAAS,gBAAA,GAAkC;AAChD,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,cAAA;AACT","file":"store.mjs","sourcesContent":["import type { LiveKitConfig, SahabAgentsOptions } from \"./types.js\";\n\nlet _options: SahabAgentsOptions | undefined;\nlet _livekitConfig: LiveKitConfig | undefined;\n\nexport function setOptions(options: SahabAgentsOptions): void {\n _options = options;\n}\n\nexport function getOptions(): SahabAgentsOptions {\n if (!_options) {\n throw new Error(\n \"SahabAgents options have not been set. Call initialize() first.\",\n );\n }\n return _options;\n}\n\nexport function setLiveKitConfig(config: LiveKitConfig): void {\n _livekitConfig = config;\n}\n\nexport function getLiveKitConfig(): LiveKitConfig {\n if (!_livekitConfig) {\n throw new Error(\n \"LiveKit config has not been set. Call initialize() first.\",\n );\n }\n return _livekitConfig;\n}\n"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|