@guava-ai/guava-sdk 0.24.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/bin/example-runner.ts +138 -11
- package/dist/bin/example-runner.d.ts +23 -6
- package/dist/bin/example-runner.js +112 -9
- package/dist/bin/example-runner.js.map +1 -1
- package/dist/examples/{example.test.js → agent-testing.test.js} +2 -2
- package/dist/examples/agent-testing.test.js.map +1 -0
- package/dist/examples/multiple-agents.d.ts +1 -0
- package/dist/examples/multiple-agents.js +52 -0
- package/dist/examples/multiple-agents.js.map +1 -0
- package/dist/examples/scheduling-outbound.js +3 -2
- package/dist/examples/scheduling-outbound.js.map +1 -1
- package/dist/src/agent.d.ts +13 -5
- package/dist/src/agent.js +9 -14
- package/dist/src/agent.js.map +1 -1
- package/dist/src/call.d.ts +3 -0
- package/dist/src/call.js +63 -23
- package/dist/src/call.js.map +1 -1
- package/dist/src/client.d.ts +3 -0
- package/dist/src/client.js +6 -0
- package/dist/src/client.js.map +1 -1
- package/dist/src/example-utils.d.ts +2 -0
- package/dist/src/example-utils.js +115 -0
- package/dist/src/example-utils.js.map +1 -0
- package/dist/src/helpers/llm.d.ts +10 -0
- package/dist/src/helpers/llm.js +54 -27
- package/dist/src/helpers/llm.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/runner.d.ts +10 -0
- package/dist/src/runner.js +101 -0
- package/dist/src/runner.js.map +1 -0
- package/dist/src/testing/session.d.ts +7 -0
- package/dist/src/testing/session.js +3 -22
- package/dist/src/testing/session.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/examples/{example.test.ts → agent-testing.test.ts} +1 -1
- package/examples/multiple-agents.ts +18 -0
- package/examples/scheduling-outbound.ts +3 -2
- package/package.json +5 -1
- package/src/agent.ts +13 -21
- package/src/call.ts +78 -23
- package/src/client.ts +7 -0
- package/src/example-utils.ts +87 -0
- package/src/helpers/llm.ts +23 -31
- package/src/index.ts +3 -1
- package/src/runner.ts +39 -0
- package/src/testing/session.ts +2 -22
- package/src/version.ts +1 -1
- package/dist/examples/example.test.js.map +0 -1
- /package/dist/examples/{example.test.d.ts → agent-testing.test.d.ts} +0 -0
package/dist/src/helpers/llm.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
2
18
|
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
3
19
|
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
4
20
|
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
@@ -33,9 +49,28 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
|
|
|
33
49
|
}
|
|
34
50
|
return useValue ? value : void 0;
|
|
35
51
|
};
|
|
52
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
53
|
+
var ownKeys = function(o) {
|
|
54
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
55
|
+
var ar = [];
|
|
56
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
57
|
+
return ar;
|
|
58
|
+
};
|
|
59
|
+
return ownKeys(o);
|
|
60
|
+
};
|
|
61
|
+
return function (mod) {
|
|
62
|
+
if (mod && mod.__esModule) return mod;
|
|
63
|
+
var result = {};
|
|
64
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
65
|
+
__setModuleDefault(result, mod);
|
|
66
|
+
return result;
|
|
67
|
+
};
|
|
68
|
+
})();
|
|
36
69
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
-
exports.IntentRecognizer = exports.DatetimeFilter = exports.DocumentQA = void 0;
|
|
70
|
+
exports.IntentRecognizer = exports.DatetimeFilter = exports._filterSchema = exports.DocumentQA = void 0;
|
|
38
71
|
exports._generate = _generate;
|
|
72
|
+
exports._makeIntentSchema = _makeIntentSchema;
|
|
73
|
+
const z = __importStar(require("zod"));
|
|
39
74
|
const client_ts_1 = require("../client.js");
|
|
40
75
|
const telemetry_ts_1 = require("../telemetry.js");
|
|
41
76
|
const utils_ts_1 = require("../utils.js");
|
|
@@ -109,15 +144,10 @@ let DocumentQA = (() => {
|
|
|
109
144
|
return DocumentQA = _classThis;
|
|
110
145
|
})();
|
|
111
146
|
exports.DocumentQA = DocumentQA;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
other_appointments: { type: "array", items: { type: "string" } },
|
|
117
|
-
},
|
|
118
|
-
required: ["matching_appointments", "other_appointments"],
|
|
119
|
-
additionalProperties: false,
|
|
120
|
-
};
|
|
147
|
+
exports._filterSchema = z.object({
|
|
148
|
+
matching_appointments: z.array(z.string()),
|
|
149
|
+
other_appointments: z.array(z.string()),
|
|
150
|
+
});
|
|
121
151
|
let DatetimeFilter = (() => {
|
|
122
152
|
let _classDecorators = [telemetry_ts_1.telemetryClient.trackClass()];
|
|
123
153
|
let _classDescriptor;
|
|
@@ -154,8 +184,8 @@ Available slots:
|
|
|
154
184
|
${this._slotsStr}
|
|
155
185
|
|
|
156
186
|
Return at most ${maxResults} items per list.`;
|
|
157
|
-
const text = await _generate(this._client, prompt, _filterSchema);
|
|
158
|
-
const result = JSON.parse(text);
|
|
187
|
+
const text = await _generate(this._client, prompt, z.toJSONSchema(exports._filterSchema));
|
|
188
|
+
const result = exports._filterSchema.parse(JSON.parse(text));
|
|
159
189
|
return [
|
|
160
190
|
result.matching_appointments.slice(0, maxResults),
|
|
161
191
|
result.other_appointments.slice(0, maxResults),
|
|
@@ -165,6 +195,15 @@ Return at most ${maxResults} items per list.`;
|
|
|
165
195
|
return DatetimeFilter = _classThis;
|
|
166
196
|
})();
|
|
167
197
|
exports.DatetimeFilter = DatetimeFilter;
|
|
198
|
+
function _makeIntentSchema(choiceList) {
|
|
199
|
+
return z
|
|
200
|
+
.object({
|
|
201
|
+
possible_matches: z
|
|
202
|
+
.array(z.enum(choiceList))
|
|
203
|
+
.describe("Choices that could match the caller's intent, ordered by likelihood. Include all plausible matches."),
|
|
204
|
+
})
|
|
205
|
+
.meta({ title: "ChoiceModel" });
|
|
206
|
+
}
|
|
168
207
|
let IntentRecognizer = (() => {
|
|
169
208
|
let _classDecorators = [telemetry_ts_1.telemetryClient.trackClass()];
|
|
170
209
|
let _classDescriptor;
|
|
@@ -186,19 +225,7 @@ let IntentRecognizer = (() => {
|
|
|
186
225
|
this._client = new client_ts_1.Client();
|
|
187
226
|
this._intentChoices = intentChoices;
|
|
188
227
|
const choiceList = Array.isArray(intentChoices) ? intentChoices : Object.keys(intentChoices);
|
|
189
|
-
this._schema =
|
|
190
|
-
type: "object",
|
|
191
|
-
title: "ChoiceModel",
|
|
192
|
-
properties: {
|
|
193
|
-
possible_matches: {
|
|
194
|
-
type: "array",
|
|
195
|
-
items: { type: "string", enum: choiceList },
|
|
196
|
-
description: "Choices that could match the caller's intent, ordered by likelihood. Include all plausible matches.",
|
|
197
|
-
},
|
|
198
|
-
},
|
|
199
|
-
required: ["possible_matches"],
|
|
200
|
-
additionalProperties: false,
|
|
201
|
-
};
|
|
228
|
+
this._schema = _makeIntentSchema(choiceList);
|
|
202
229
|
}
|
|
203
230
|
async classify(intent) {
|
|
204
231
|
const choiceList = Array.isArray(this._intentChoices)
|
|
@@ -220,8 +247,8 @@ Rules:
|
|
|
220
247
|
.join("\n ");
|
|
221
248
|
prompt += `\n\nDetailed descriptions of each choice:\n ${descriptionString}`;
|
|
222
249
|
}
|
|
223
|
-
const text = await _generate(this._client, prompt, this._schema);
|
|
224
|
-
const keys = JSON.parse(text)
|
|
250
|
+
const text = await _generate(this._client, prompt, z.toJSONSchema(this._schema));
|
|
251
|
+
const { possible_matches: keys } = this._schema.parse(JSON.parse(text));
|
|
225
252
|
if (!keys.length)
|
|
226
253
|
return null;
|
|
227
254
|
if (!Array.isArray(this._intentChoices)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/helpers/llm.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/helpers/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export { Client, type InboundConnection } from "./client.ts";
|
|
2
|
+
export { Runner } from "./runner.ts";
|
|
2
3
|
export type { SmsMessage } from "./sms.ts";
|
|
3
4
|
export { CallController, type TaskObjective } from "./call-controller.ts";
|
|
4
5
|
export { Say, Field } from "./action-item.ts";
|
|
5
6
|
export { Logger, getConsoleLogger, getDefaultLogger } from "./logging.ts";
|
|
6
7
|
export { Agent, CallInfo } from "./agent.ts";
|
|
7
|
-
export { Call } from "./call.ts";
|
|
8
|
+
export { Call, DEFAULT_REACH_PERSON_OUTCOMES } from "./call.ts";
|
|
9
|
+
export type { ReachPersonOutcome } from "./call.ts";
|
|
8
10
|
export type { BotSessionEnded, TerminationReason, DTMFPressedEvent, DTMFDigit } from "./events.ts";
|
|
9
11
|
export { TestSession } from "./testing/session.ts";
|
|
10
12
|
export { MockCall } from "./testing/mocks.ts";
|
package/dist/src/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MockCall = exports.TestSession = exports.Call = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.CallController = exports.Client = void 0;
|
|
3
|
+
exports.MockCall = exports.TestSession = exports.DEFAULT_REACH_PERSON_OUTCOMES = exports.Call = exports.Agent = exports.getDefaultLogger = exports.getConsoleLogger = exports.Field = exports.Say = exports.CallController = exports.Runner = exports.Client = void 0;
|
|
4
4
|
var client_ts_1 = require("./client.js");
|
|
5
5
|
Object.defineProperty(exports, "Client", { enumerable: true, get: function () { return client_ts_1.Client; } });
|
|
6
|
+
var runner_ts_1 = require("./runner.js");
|
|
7
|
+
Object.defineProperty(exports, "Runner", { enumerable: true, get: function () { return runner_ts_1.Runner; } });
|
|
6
8
|
var call_controller_ts_1 = require("./call-controller.js");
|
|
7
9
|
Object.defineProperty(exports, "CallController", { enumerable: true, get: function () { return call_controller_ts_1.CallController; } });
|
|
8
10
|
var action_item_ts_1 = require("./action-item.js");
|
|
@@ -15,6 +17,7 @@ var agent_ts_1 = require("./agent.js");
|
|
|
15
17
|
Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_ts_1.Agent; } });
|
|
16
18
|
var call_ts_1 = require("./call.js");
|
|
17
19
|
Object.defineProperty(exports, "Call", { enumerable: true, get: function () { return call_ts_1.Call; } });
|
|
20
|
+
Object.defineProperty(exports, "DEFAULT_REACH_PERSON_OUTCOMES", { enumerable: true, get: function () { return call_ts_1.DEFAULT_REACH_PERSON_OUTCOMES; } });
|
|
18
21
|
var session_ts_1 = require("./testing/session.js");
|
|
19
22
|
Object.defineProperty(exports, "TestSession", { enumerable: true, get: function () { return session_ts_1.TestSession; } });
|
|
20
23
|
var mocks_ts_1 = require("./testing/mocks.js");
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,mGAAA,MAAM,OAAA;AAEf,2DAA0E;AAAjE,oHAAA,cAAc,OAAA;AACvB,mDAA8C;AAArC,qGAAA,GAAG,OAAA;AAAE,uGAAA,KAAK,OAAA;AACnB,2CAA0E;AAAzD,8GAAA,gBAAgB,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AACnD,uCAA6C;AAApC,iGAAA,KAAK,OAAA;AACd,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6D;AAApD,mGAAA,MAAM,OAAA;AACf,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AAEf,2DAA0E;AAAjE,oHAAA,cAAc,OAAA;AACvB,mDAA8C;AAArC,qGAAA,GAAG,OAAA;AAAE,uGAAA,KAAK,OAAA;AACnB,2CAA0E;AAAzD,8GAAA,gBAAgB,OAAA;AAAE,8GAAA,gBAAgB,OAAA;AACnD,uCAA6C;AAApC,iGAAA,KAAK,OAAA;AACd,qCAAgE;AAAvD,+FAAA,IAAI,OAAA;AAAE,wHAAA,6BAA6B,OAAA;AAG5C,mDAAmD;AAA1C,yGAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Agent } from "./agent.ts";
|
|
2
|
+
export declare class Runner {
|
|
3
|
+
private _healthCtx;
|
|
4
|
+
private _tasks;
|
|
5
|
+
listenPhone(agent: Agent, agentNumber: string): this;
|
|
6
|
+
listenWebrtc(agent: Agent, webrtcCode?: string): this;
|
|
7
|
+
listenSip(agent: Agent, sipCode: string): this;
|
|
8
|
+
attachCampaign(agent: Agent, campaignCode: string): this;
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
3
|
+
if (value !== null && value !== void 0) {
|
|
4
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
5
|
+
var dispose, inner;
|
|
6
|
+
if (async) {
|
|
7
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
8
|
+
dispose = value[Symbol.asyncDispose];
|
|
9
|
+
}
|
|
10
|
+
if (dispose === void 0) {
|
|
11
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
12
|
+
dispose = value[Symbol.dispose];
|
|
13
|
+
if (async) inner = dispose;
|
|
14
|
+
}
|
|
15
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
16
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
17
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
18
|
+
}
|
|
19
|
+
else if (async) {
|
|
20
|
+
env.stack.push({ async: true });
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
25
|
+
return function (env) {
|
|
26
|
+
function fail(e) {
|
|
27
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
28
|
+
env.hasError = true;
|
|
29
|
+
}
|
|
30
|
+
var r, s = 0;
|
|
31
|
+
function next() {
|
|
32
|
+
while (r = env.stack.pop()) {
|
|
33
|
+
try {
|
|
34
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
35
|
+
if (r.dispose) {
|
|
36
|
+
var result = r.dispose.call(r.value);
|
|
37
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
38
|
+
}
|
|
39
|
+
else s |= 1;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
fail(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
46
|
+
if (env.hasError) throw env.error;
|
|
47
|
+
}
|
|
48
|
+
return next();
|
|
49
|
+
};
|
|
50
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
51
|
+
var e = new Error(message);
|
|
52
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.Runner = void 0;
|
|
56
|
+
const health_ts_1 = require("./health.js");
|
|
57
|
+
class Runner {
|
|
58
|
+
_healthCtx = new health_ts_1.MultiHealthContext();
|
|
59
|
+
_tasks = [];
|
|
60
|
+
listenPhone(agent, agentNumber) {
|
|
61
|
+
const ctx = this._healthCtx.createCtx();
|
|
62
|
+
this._tasks.push(() => agent._listenInbound(ctx, { agent_number: agentNumber }));
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
listenWebrtc(agent, webrtcCode) {
|
|
66
|
+
const ctx = this._healthCtx.createCtx();
|
|
67
|
+
this._tasks.push(async () => {
|
|
68
|
+
const code = webrtcCode ?? (await agent._client.createWebrtcAgent(3600));
|
|
69
|
+
return agent._listenInbound(ctx, { webrtc_code: code });
|
|
70
|
+
});
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
listenSip(agent, sipCode) {
|
|
74
|
+
const ctx = this._healthCtx.createCtx();
|
|
75
|
+
this._tasks.push(() => agent._listenInbound(ctx, { sip_code: sipCode }));
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
attachCampaign(agent, campaignCode) {
|
|
79
|
+
const ctx = this._healthCtx.createCtx();
|
|
80
|
+
this._tasks.push(() => agent._serveCampaign(ctx, campaignCode));
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
async run() {
|
|
84
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
85
|
+
try {
|
|
86
|
+
const _server = __addDisposableResource(env_1, await (0, health_ts_1.getHealthServer)(this._healthCtx), true);
|
|
87
|
+
await Promise.all(this._tasks.map((task) => task()));
|
|
88
|
+
}
|
|
89
|
+
catch (e_1) {
|
|
90
|
+
env_1.error = e_1;
|
|
91
|
+
env_1.hasError = true;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
const result_1 = __disposeResources(env_1);
|
|
95
|
+
if (result_1)
|
|
96
|
+
await result_1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.Runner = Runner;
|
|
101
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAAkE;AAElE,MAAa,MAAM;IACT,UAAU,GAAG,IAAI,8BAAkB,EAAE,CAAC;IACtC,MAAM,GAA+B,EAAE,CAAC;IAEhD,WAAW,CAAC,KAAY,EAAE,WAAmB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,KAAY,EAAE,UAAmB;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,OAAO,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAY,EAAE,OAAe;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,KAAY,EAAE,YAAoB;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG;;;YACP,MAAY,OAAO,kCAAG,MAAM,IAAA,2BAAe,EAAC,IAAI,CAAC,UAAU,CAAC,OAAA,CAAC;YAC7D,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;;;;;;;;;;;KACtD;CACF;AAnCD,wBAmCC"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import type WebSocket from "ws";
|
|
2
|
+
import * as z from "zod";
|
|
2
3
|
import { type BotTTS, type InjectASR, TestingEvent } from "./protocol.ts";
|
|
3
4
|
import type { Client } from "../client.ts";
|
|
5
|
+
export declare const _evalResponseSchema: z.ZodObject<{
|
|
6
|
+
results: z.ZodArray<z.ZodObject<{
|
|
7
|
+
passed: z.ZodBoolean;
|
|
8
|
+
reasoning: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>>;
|
|
10
|
+
}, z.core.$strip>;
|
|
4
11
|
export declare class TestSession {
|
|
5
12
|
private readonly _ws;
|
|
6
13
|
private readonly _client;
|
|
@@ -33,12 +33,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.TestSession = void 0;
|
|
36
|
+
exports.TestSession = exports._evalResponseSchema = void 0;
|
|
37
37
|
const node_crypto_1 = require("node:crypto");
|
|
38
38
|
const z = __importStar(require("zod"));
|
|
39
39
|
const protocol_ts_1 = require("./protocol.js");
|
|
40
40
|
const llm_ts_1 = require("../helpers/llm.js");
|
|
41
|
-
|
|
41
|
+
exports._evalResponseSchema = z.object({
|
|
42
42
|
results: z.array(z.object({
|
|
43
43
|
passed: z.boolean(),
|
|
44
44
|
reasoning: z.string().optional(),
|
|
@@ -170,26 +170,7 @@ ${transcript || "(empty — no conversation occurred)"}
|
|
|
170
170
|
|
|
171
171
|
Criteria:
|
|
172
172
|
${criteriaList}`;
|
|
173
|
-
const
|
|
174
|
-
type: "object",
|
|
175
|
-
properties: {
|
|
176
|
-
results: {
|
|
177
|
-
type: "array",
|
|
178
|
-
items: {
|
|
179
|
-
type: "object",
|
|
180
|
-
properties: {
|
|
181
|
-
passed: { type: "boolean" },
|
|
182
|
-
reasoning: { type: "string" },
|
|
183
|
-
},
|
|
184
|
-
required: ["passed"],
|
|
185
|
-
additionalProperties: false,
|
|
186
|
-
},
|
|
187
|
-
},
|
|
188
|
-
},
|
|
189
|
-
required: ["results"],
|
|
190
|
-
additionalProperties: false,
|
|
191
|
-
};
|
|
192
|
-
const evalResponse = _evalResponseSchema.parse(JSON.parse(await (0, llm_ts_1._generate)(this._client, prompt, evalSchema)));
|
|
173
|
+
const evalResponse = exports._evalResponseSchema.parse(JSON.parse(await (0, llm_ts_1._generate)(this._client, prompt, z.toJSONSchema(exports._evalResponseSchema))));
|
|
193
174
|
if (evalResponse.results.length !== allCriteria.length) {
|
|
194
175
|
throw new Error(`Evaluation returned ${evalResponse.results.length} results for ${allCriteria.length} criteria.`);
|
|
195
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/testing/session.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,6CAA0C;AAC1C,uCAAyB;AACzB,+CAA0E;AAE1E,8CAA8C;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/testing/session.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "0.
|
|
1
|
+
export declare const SDK_VERSION = "0.25.0";
|
package/dist/src/version.js
CHANGED
|
@@ -10,7 +10,7 @@ import { agent } from "@guava-ai/guava-sdk/examples/help-desk";
|
|
|
10
10
|
describe("HelpDeskAgent", () => {
|
|
11
11
|
test("handler unit test - new purchase routes to sales", async () => {
|
|
12
12
|
const suggestion = await agent.handlers.onActionRequest(new MockCall(), "make a new purchase");
|
|
13
|
-
expect(suggestion).
|
|
13
|
+
expect(suggestion).toContainEqual({ key: "sales" });
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
test("new purchase routes to sales", async () => {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as guava from "@guava-ai/guava-sdk";
|
|
2
|
+
|
|
3
|
+
const agentA = new guava.Agent({
|
|
4
|
+
name: "Grace",
|
|
5
|
+
purpose: "You are a helpful voice agent.",
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
const agentB = new guava.Agent({
|
|
9
|
+
name: "Jordan",
|
|
10
|
+
purpose: "You are a helpful voice agent.",
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export async function run(_args: string[]) {
|
|
14
|
+
const runner = new guava.Runner();
|
|
15
|
+
runner.listenPhone(agentA, process.env.GUAVA_AGENT_NUMBER!);
|
|
16
|
+
runner.listenWebrtc(agentB);
|
|
17
|
+
await runner.run();
|
|
18
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as guava from "@guava-ai/guava-sdk";
|
|
2
2
|
import { DatetimeFilter } from "@guava-ai/guava-sdk/helpers";
|
|
3
3
|
import { mockAppointmentsForFuture } from "@guava-ai/guava-sdk/example-data";
|
|
4
|
+
import { getAgentNumber } from "@guava-ai/guava-sdk/example-utils";
|
|
4
5
|
|
|
5
6
|
const agent = new guava.Agent({
|
|
6
7
|
organization: "Bright Smile Dental",
|
|
@@ -33,7 +34,7 @@ agent.onReachPerson(async (call: guava.Call, outcome: string) => {
|
|
|
33
34
|
],
|
|
34
35
|
});
|
|
35
36
|
} else {
|
|
36
|
-
await call.hangup("
|
|
37
|
+
await call.hangup("Appropriately end the call.");
|
|
37
38
|
}
|
|
38
39
|
});
|
|
39
40
|
|
|
@@ -56,7 +57,7 @@ export async function run(args: string[]) {
|
|
|
56
57
|
process.exit(1);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
agent.callPhone(
|
|
60
|
+
agent.callPhone(await getAgentNumber(), toNumber, {
|
|
60
61
|
patientName: patientName,
|
|
61
62
|
});
|
|
62
63
|
}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@guava-ai/guava-sdk",
|
|
3
3
|
"description": "The official TypeScript SDK for building Guava voice agents.",
|
|
4
4
|
"homepage": "https://docs.goguava.ai/typescript-sdk/",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.25.0",
|
|
6
6
|
"type": "commonjs",
|
|
7
7
|
"main": "dist/src/index.js",
|
|
8
8
|
"types": "dist/src/index.d.ts",
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
"types": "./dist/src/example-data.d.ts",
|
|
24
24
|
"default": "./dist/src/example-data.js"
|
|
25
25
|
},
|
|
26
|
+
"./example-utils": {
|
|
27
|
+
"types": "./dist/src/example-utils.d.ts",
|
|
28
|
+
"default": "./dist/src/example-utils.js"
|
|
29
|
+
},
|
|
26
30
|
"./examples/help-desk": {
|
|
27
31
|
"types": "./dist/examples/help-desk.d.ts",
|
|
28
32
|
"default": "./dist/examples/help-desk.js"
|
package/src/agent.ts
CHANGED
|
@@ -31,9 +31,15 @@ import { telemetryClient } from "./telemetry.ts";
|
|
|
31
31
|
import { runChat } from "./testing/chat.ts";
|
|
32
32
|
import { SessionStarted } from "./testing/protocol.ts";
|
|
33
33
|
import { TestSession } from "./testing/session.ts";
|
|
34
|
+
import * as z from "zod";
|
|
34
35
|
import { fetchOrThrow, getBaseUrl } from "./utils.ts";
|
|
35
36
|
import { runWebrtcHelper } from "./webrtc-helper.ts";
|
|
36
37
|
|
|
38
|
+
export const _roleplayActionSchema = z.object({
|
|
39
|
+
action: z.enum(["speak", "hangup"]),
|
|
40
|
+
utterance: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
|
|
37
43
|
export type { CallInfo } from "./socket/call-info.ts";
|
|
38
44
|
|
|
39
45
|
export type IncomingCallAction = { action: "accept" } | { action: "decline" };
|
|
@@ -57,7 +63,7 @@ export class Agent {
|
|
|
57
63
|
private _acceptDtmfForNumbers: boolean;
|
|
58
64
|
private _logger: Logger;
|
|
59
65
|
|
|
60
|
-
|
|
66
|
+
_client: Client = new Client();
|
|
61
67
|
|
|
62
68
|
private _onCallReceived: (callInfo: CallInfo) => Promise<IncomingCallAction> = async () => ({
|
|
63
69
|
action: "accept",
|
|
@@ -572,12 +578,12 @@ export class Agent {
|
|
|
572
578
|
* @description use the Guava API to call out to a number
|
|
573
579
|
*/
|
|
574
580
|
async callPhone(
|
|
575
|
-
fromNumber: string
|
|
581
|
+
fromNumber: string,
|
|
576
582
|
toNumber: string,
|
|
577
583
|
variables: Record<string, any> = {},
|
|
578
584
|
): Promise<void> {
|
|
579
585
|
const url = new URL("v2/create-outbound", this._client.getHttpBase());
|
|
580
|
-
|
|
586
|
+
url.searchParams.set("from_number", fromNumber);
|
|
581
587
|
url.searchParams.set("to_number", toNumber);
|
|
582
588
|
|
|
583
589
|
const response = await fetchOrThrow(url, {
|
|
@@ -681,16 +687,6 @@ export class Agent {
|
|
|
681
687
|
roleplayPrompt: string,
|
|
682
688
|
variables: Record<string, any> = {},
|
|
683
689
|
): Promise<TestSession> {
|
|
684
|
-
const roleplaySchema = {
|
|
685
|
-
type: "object",
|
|
686
|
-
properties: {
|
|
687
|
-
action: { type: "string", enum: ["speak", "hangup"] },
|
|
688
|
-
utterance: { type: "string" },
|
|
689
|
-
},
|
|
690
|
-
required: ["action"],
|
|
691
|
-
additionalProperties: false,
|
|
692
|
-
};
|
|
693
|
-
|
|
694
690
|
return this.test(async (session) => {
|
|
695
691
|
let snapshotLen = 0;
|
|
696
692
|
try {
|
|
@@ -714,8 +710,8 @@ ${transcript || "(The agent has not spoken yet)"}
|
|
|
714
710
|
|
|
715
711
|
Choose "speak" and provide your next utterance, or choose "hangup" if the conversation has naturally concluded.`;
|
|
716
712
|
|
|
717
|
-
const raw = await _generate(this._client, prompt,
|
|
718
|
-
const action = JSON.parse(raw)
|
|
713
|
+
const raw = await _generate(this._client, prompt, z.toJSONSchema(_roleplayActionSchema));
|
|
714
|
+
const action = _roleplayActionSchema.parse(JSON.parse(raw));
|
|
719
715
|
|
|
720
716
|
if (action.action === "hangup") {
|
|
721
717
|
this._logger.info("(Roleplay Session) [caller hangs up]");
|
|
@@ -803,7 +799,7 @@ Choose "speak" and provide your next utterance, or choose "hangup" if the conver
|
|
|
803
799
|
return cloned;
|
|
804
800
|
}
|
|
805
801
|
|
|
806
|
-
|
|
802
|
+
async _serveCampaign(healthCtx: HealthContext, campaignCode: string): Promise<void> {
|
|
807
803
|
try {
|
|
808
804
|
const campaignUrl = new URL(`v1/campaigns/${campaignCode}`, this._client.getHttpBase());
|
|
809
805
|
const campaignResponse = await fetchOrThrow(campaignUrl, {
|
|
@@ -898,11 +894,7 @@ Choose "speak" and provide your next utterance, or choose "hangup" if the conver
|
|
|
898
894
|
}
|
|
899
895
|
|
|
900
896
|
/** @deprecated Use {@link callPhone} instead. */
|
|
901
|
-
async outboundPhone(
|
|
902
|
-
fromNumber: string | undefined,
|
|
903
|
-
toNumber: string,
|
|
904
|
-
variables: Record<string, any> = {},
|
|
905
|
-
) {
|
|
897
|
+
async outboundPhone(fromNumber: string, toNumber: string, variables: Record<string, any> = {}) {
|
|
906
898
|
return this.callPhone(fromNumber, toNumber, variables);
|
|
907
899
|
}
|
|
908
900
|
}
|