@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.
@@ -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"]}
@@ -1,32 +1,9 @@
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);
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 agents.voice.Agent {
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 = agents.defineAgent({
24
+ var internal_agent_default = defineAgent({
48
25
  prewarm: async (proc) => {
49
- proc.userData.vad = await silero__namespace.VAD.load();
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 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(),
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 agents.metrics.UsageCollector();
64
- session.on(agents.voice.AgentSessionEventTypes.MetricsCollected, (ev) => {
65
- agents.metrics.logMetrics(ev.metrics);
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
- module.exports = internal_agent_default;
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","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.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
+ {"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
- import { voice } from '@livekit/agents';
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
- export { Agent };
14
- //# sourceMappingURL=agent-instructions.mjs.map
15
- //# sourceMappingURL=agent-instructions.mjs.map
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
- 'use strict';
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 agents.voice.Agent {
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
- exports.Agent = Agent;
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":["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.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
+ {"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
- import { cli, ServerOptions } from '@livekit/agents';
2
- import * as path from 'path';
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 agentPath = path.resolve(__dirname, "_internal-agent.js");
118
- cli.runApp(
119
- new ServerOptions({
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
- export { ApiError, SahabAgents, SahabAgentsError, TimeoutError };
140
- //# sourceMappingURL=index.mjs.map
141
- //# sourceMappingURL=index.mjs.map
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":"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","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"]}
@@ -1,4 +1,4 @@
1
- import { S as SahabAgentsOptions, A as ApiErrorBody } from './types-BbAGABHE.mjs';
1
+ import { S as SahabAgentsOptions, A as ApiErrorBody } from './types-BbAGABHE.cjs';
2
2
 
3
3
  declare class HttpClient {
4
4
  private readonly baseUrl;
package/dist/index.js CHANGED
@@ -1,27 +1,6 @@
1
- 'use strict';
2
-
3
- var agents = require('@livekit/agents');
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 agentPath = path__namespace.resolve(__dirname, "_internal-agent.js");
140
- agents.cli.runApp(
141
- new agents.ServerOptions({
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
- exports.ApiError = ApiError;
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
- export { getLiveKitConfig, getOptions, setLiveKitConfig, setOptions };
28
- //# sourceMappingURL=store.mjs.map
29
- //# sourceMappingURL=store.mjs.map
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.mjs';
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
- exports.getLiveKitConfig = getLiveKitConfig;
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":";;;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"]}
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",
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",
@@ -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"]}
@@ -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"]}
@@ -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"]}