lumnisai 0.5.48 → 0.5.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +352 -14
- package/dist/index.d.cts +793 -5
- package/dist/index.d.mts +793 -5
- package/dist/index.d.ts +793 -5
- package/dist/index.mjs +352 -14
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1938,7 +1938,12 @@ const PASSTHROUGH_VALUE_KEYS = /* @__PURE__ */ new Set([
|
|
|
1938
1938
|
"customFields",
|
|
1939
1939
|
"custom_fields",
|
|
1940
1940
|
"engagementProfile",
|
|
1941
|
-
"engagement_profile"
|
|
1941
|
+
"engagement_profile",
|
|
1942
|
+
// account_monitor's committee: its own fields (`people`, `groups`) are
|
|
1943
|
+
// spelled the same in both cases, while the group labels underneath
|
|
1944
|
+
// `groups` are caller-chosen names such as 'Security team'. Converting
|
|
1945
|
+
// those would rename the customer's own groups.
|
|
1946
|
+
"committee"
|
|
1942
1947
|
]);
|
|
1943
1948
|
function convertCase(obj, converter) {
|
|
1944
1949
|
if (Array.isArray(obj)) {
|
|
@@ -3256,6 +3261,38 @@ const ENGAGEMENT_ACTIVITIES = [
|
|
|
3256
3261
|
"comments",
|
|
3257
3262
|
"authored_posts"
|
|
3258
3263
|
];
|
|
3264
|
+
const ACCOUNT_MONITOR_SIGNALS = [
|
|
3265
|
+
"company_hiring",
|
|
3266
|
+
"company_news",
|
|
3267
|
+
"company_funding",
|
|
3268
|
+
"company_posts",
|
|
3269
|
+
"company_mention",
|
|
3270
|
+
"company_background",
|
|
3271
|
+
"committee_activity",
|
|
3272
|
+
"committee_to_competitor",
|
|
3273
|
+
"competitor_to_committee",
|
|
3274
|
+
"committee_to_our_company",
|
|
3275
|
+
"account_to_our_company"
|
|
3276
|
+
];
|
|
3277
|
+
const RETIRED_ACCOUNT_MONITOR_SIGNALS = [
|
|
3278
|
+
"incoming_engagement",
|
|
3279
|
+
"our_company_to_committee",
|
|
3280
|
+
"our_company_to_account"
|
|
3281
|
+
];
|
|
3282
|
+
const ACCOUNT_MONITOR_FIELDS = [
|
|
3283
|
+
["account", "account"],
|
|
3284
|
+
["depth", "depth"],
|
|
3285
|
+
["committee", "committee"],
|
|
3286
|
+
["competitors", "competitors"],
|
|
3287
|
+
["ourCompany", "our_company"],
|
|
3288
|
+
["days", "days"],
|
|
3289
|
+
["window", "window"],
|
|
3290
|
+
["signalDefinitions", "signal_definitions"],
|
|
3291
|
+
["intentScoringInstructions", "intent_scoring_instructions"],
|
|
3292
|
+
["history", "history"],
|
|
3293
|
+
["tier", "tier"]
|
|
3294
|
+
];
|
|
3295
|
+
const ACCOUNT_MONITOR_FIELD_KEYS = new Set(ACCOUNT_MONITOR_FIELDS.flat());
|
|
3259
3296
|
const MAX_SIGNAL_CONTEXT_CHARS = 4e3;
|
|
3260
3297
|
const MAX_CONTENT_INTELLIGENCE_COMPETITORS = 5;
|
|
3261
3298
|
const MAX_CONTENT_INTELLIGENCE_COMPETITOR_CHARS = 200;
|
|
@@ -3874,6 +3911,233 @@ class ResponsesResource {
|
|
|
3874
3911
|
);
|
|
3875
3912
|
}
|
|
3876
3913
|
}
|
|
3914
|
+
/**
|
|
3915
|
+
* Validate one merged `account_monitor` request.
|
|
3916
|
+
*
|
|
3917
|
+
* The monitor's parameters are a CLOSED shape server-side, so unknown keys
|
|
3918
|
+
* are rejected here with the offending name rather than failing after the
|
|
3919
|
+
* request is sent. Everything else mirrors the backend's own rules: an
|
|
3920
|
+
* account that identity resolution can actually resolve, one period (days
|
|
3921
|
+
* OR window, never both), and explicit people/title scopes.
|
|
3922
|
+
*/
|
|
3923
|
+
_validateAccountMonitorParams(params) {
|
|
3924
|
+
const account = params.account;
|
|
3925
|
+
if (typeof account !== "string" || !account.trim()) {
|
|
3926
|
+
throw new ValidationError(
|
|
3927
|
+
"`account` is required for account_monitor \u2014 give the monitored company's domain, website, or LinkedIn company URL. A bare company name cannot be resolved."
|
|
3928
|
+
);
|
|
3929
|
+
}
|
|
3930
|
+
const depth = params.depth;
|
|
3931
|
+
if (depth !== void 0 && depth !== "light" && depth !== "deep")
|
|
3932
|
+
throw new ValidationError(`depth must be 'light' or 'deep' for account_monitor`);
|
|
3933
|
+
const days = params.days;
|
|
3934
|
+
if (days !== void 0 && (!Number.isInteger(days) || days < 1))
|
|
3935
|
+
throw new ValidationError("days must be a positive integer for account_monitor");
|
|
3936
|
+
const window = params.window;
|
|
3937
|
+
if (window !== void 0) {
|
|
3938
|
+
if (days !== void 0)
|
|
3939
|
+
throw new ValidationError("Supply days or window for account_monitor, not both");
|
|
3940
|
+
if (!this._isPlainObject(window)) {
|
|
3941
|
+
throw new ValidationError(
|
|
3942
|
+
"window must be an object with startAt and endAt timestamps for account_monitor"
|
|
3943
|
+
);
|
|
3944
|
+
}
|
|
3945
|
+
for (const [camel, snake] of [["startAt", "start_at"], ["endAt", "end_at"]]) {
|
|
3946
|
+
const value = this._getParamValue(window, camel, snake);
|
|
3947
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
3948
|
+
throw new ValidationError(
|
|
3949
|
+
`window.${camel} must be a timezone-aware ISO 8601 timestamp for account_monitor`
|
|
3950
|
+
);
|
|
3951
|
+
}
|
|
3952
|
+
}
|
|
3953
|
+
}
|
|
3954
|
+
this._validateAccountMonitorCommittee(params.committee);
|
|
3955
|
+
const competitors = params.competitors;
|
|
3956
|
+
if (competitors !== void 0) {
|
|
3957
|
+
if (!Array.isArray(competitors))
|
|
3958
|
+
throw new ValidationError("competitors must be an array for account_monitor");
|
|
3959
|
+
competitors.forEach((competitor, index) => this._validateAccountMonitorCompany(competitor, `competitors[${index}]`));
|
|
3960
|
+
}
|
|
3961
|
+
if (params.ourCompany !== void 0)
|
|
3962
|
+
this._validateAccountMonitorCompany(params.ourCompany, "ourCompany");
|
|
3963
|
+
const history = params.history;
|
|
3964
|
+
if (history !== void 0 && typeof history !== "string" && !this._isPlainObject(history)) {
|
|
3965
|
+
throw new ValidationError(
|
|
3966
|
+
"history must be an object or a string for account_monitor \u2014 the run compares against what you supply here, it never looks a previous response up."
|
|
3967
|
+
);
|
|
3968
|
+
}
|
|
3969
|
+
const tier = params.tier;
|
|
3970
|
+
if (tier !== void 0 && typeof tier !== "string")
|
|
3971
|
+
throw new ValidationError("tier must be a string for account_monitor");
|
|
3972
|
+
const instructions = params.intentScoringInstructions;
|
|
3973
|
+
if (instructions !== void 0 && typeof instructions !== "string")
|
|
3974
|
+
throw new ValidationError("intentScoringInstructions must be a string");
|
|
3975
|
+
this._validateAccountMonitorSignalDefinitions(params.signalDefinitions);
|
|
3976
|
+
}
|
|
3977
|
+
/** People are LinkedIn profile URLs; no employee discovery is ever implied. */
|
|
3978
|
+
_validateAccountMonitorProfiles(value, field) {
|
|
3979
|
+
if (!Array.isArray(value) || value.some((url) => typeof url !== "string" || !url.trim())) {
|
|
3980
|
+
throw new ValidationError(
|
|
3981
|
+
`${field} must be an array of LinkedIn profile URLs for account_monitor`
|
|
3982
|
+
);
|
|
3983
|
+
}
|
|
3984
|
+
}
|
|
3985
|
+
/**
|
|
3986
|
+
* The committee accepts the full `{ people, groups }` object, a bare URL
|
|
3987
|
+
* array, or a legacy label-to-URLs map. A map that carries `people` or
|
|
3988
|
+
* `groups` is read as the full object, exactly as the backend reads it.
|
|
3989
|
+
*/
|
|
3990
|
+
_validateAccountMonitorCommittee(committee) {
|
|
3991
|
+
if (committee === void 0)
|
|
3992
|
+
return;
|
|
3993
|
+
if (Array.isArray(committee)) {
|
|
3994
|
+
this._validateAccountMonitorProfiles(committee, "committee");
|
|
3995
|
+
return;
|
|
3996
|
+
}
|
|
3997
|
+
if (!this._isPlainObject(committee)) {
|
|
3998
|
+
throw new ValidationError(
|
|
3999
|
+
"committee must be an object with people and/or groups, an array of LinkedIn profile URLs, or a map of group name to URLs"
|
|
4000
|
+
);
|
|
4001
|
+
}
|
|
4002
|
+
const hasPeople = Object.prototype.hasOwnProperty.call(committee, "people");
|
|
4003
|
+
const hasGroups = Object.prototype.hasOwnProperty.call(committee, "groups");
|
|
4004
|
+
if (!hasPeople && !hasGroups) {
|
|
4005
|
+
this._validateAccountMonitorGroups(committee, "committee");
|
|
4006
|
+
return;
|
|
4007
|
+
}
|
|
4008
|
+
if (hasPeople)
|
|
4009
|
+
this._validateAccountMonitorProfiles(committee.people, "committee.people");
|
|
4010
|
+
if (hasGroups) {
|
|
4011
|
+
if (!this._isPlainObject(committee.groups))
|
|
4012
|
+
throw new ValidationError("committee.groups must map each group name to LinkedIn profile URLs");
|
|
4013
|
+
this._validateAccountMonitorGroups(committee.groups, "committee.groups");
|
|
4014
|
+
}
|
|
4015
|
+
}
|
|
4016
|
+
_validateAccountMonitorGroups(groups, field) {
|
|
4017
|
+
for (const [label, people] of Object.entries(groups)) {
|
|
4018
|
+
if (!label.trim())
|
|
4019
|
+
throw new ValidationError(`${field} group names must not be blank`);
|
|
4020
|
+
this._validateAccountMonitorProfiles(people, `${field}['${label}']`);
|
|
4021
|
+
}
|
|
4022
|
+
}
|
|
4023
|
+
/**
|
|
4024
|
+
* A company string means the company page only. People and titles are the
|
|
4025
|
+
* only ways to reach employees — neither is implied by the company itself.
|
|
4026
|
+
*/
|
|
4027
|
+
_validateAccountMonitorCompany(value, field) {
|
|
4028
|
+
if (typeof value === "string") {
|
|
4029
|
+
if (!value.trim())
|
|
4030
|
+
throw new ValidationError(`${field} must be a non-empty company domain, URL, or name`);
|
|
4031
|
+
return;
|
|
4032
|
+
}
|
|
4033
|
+
if (!this._isPlainObject(value)) {
|
|
4034
|
+
throw new ValidationError(
|
|
4035
|
+
`${field} must be a company string, or an object with company and an explicit people or employeeTitles scope`
|
|
4036
|
+
);
|
|
4037
|
+
}
|
|
4038
|
+
for (const key of Object.keys(value)) {
|
|
4039
|
+
if (!["company", "people", "employeeTitles", "employee_titles"].includes(key)) {
|
|
4040
|
+
throw new ValidationError(
|
|
4041
|
+
`Unknown ${field} field '${key}'. A company accepts only company, people, and employeeTitles.`
|
|
4042
|
+
);
|
|
4043
|
+
}
|
|
4044
|
+
}
|
|
4045
|
+
const company = this._getParamValue(value, "company", "company");
|
|
4046
|
+
if (typeof company !== "string" || !company.trim())
|
|
4047
|
+
throw new ValidationError(`${field}.company is required and must be a non-empty string`);
|
|
4048
|
+
const people = this._getParamValue(value, "people", "people");
|
|
4049
|
+
if (people !== void 0)
|
|
4050
|
+
this._validateAccountMonitorProfiles(people, `${field}.people`);
|
|
4051
|
+
const employeeTitles = this._getParamValue(value, "employeeTitles", "employee_titles");
|
|
4052
|
+
if (employeeTitles !== void 0 && employeeTitles !== null) {
|
|
4053
|
+
if (!Array.isArray(employeeTitles) || employeeTitles.length === 0 || employeeTitles.some((title) => typeof title !== "string" || !title.trim())) {
|
|
4054
|
+
throw new ValidationError(
|
|
4055
|
+
`${field}.employeeTitles must contain at least one non-blank current-title filter. Omit it to skip employee discovery entirely.`
|
|
4056
|
+
);
|
|
4057
|
+
}
|
|
4058
|
+
}
|
|
4059
|
+
}
|
|
4060
|
+
_validateAccountMonitorSignalDefinitions(value) {
|
|
4061
|
+
if (value === void 0 || value === null)
|
|
4062
|
+
return;
|
|
4063
|
+
if (!Array.isArray(value))
|
|
4064
|
+
throw new ValidationError("signalDefinitions must be an array");
|
|
4065
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4066
|
+
for (const entry of value) {
|
|
4067
|
+
if (!this._isPlainObject(entry)) {
|
|
4068
|
+
throw new ValidationError(
|
|
4069
|
+
`Each account_monitor signalDefinitions entry must be an object like { name: 'company_hiring' }`
|
|
4070
|
+
);
|
|
4071
|
+
}
|
|
4072
|
+
const rawName = this._getParamValue(entry, "name", "name");
|
|
4073
|
+
const name = typeof rawName === "string" ? rawName.trim().toLowerCase() : rawName;
|
|
4074
|
+
if (typeof name !== "string" || !name)
|
|
4075
|
+
throw new ValidationError("Each signalDefinitions entry requires a signal name");
|
|
4076
|
+
if (RETIRED_ACCOUNT_MONITOR_SIGNALS.includes(name)) {
|
|
4077
|
+
throw new ValidationError(
|
|
4078
|
+
`The '${name}' monitor check was retired and can no longer be requested. Choose from: ${ACCOUNT_MONITOR_SIGNALS.join(", ")}.`
|
|
4079
|
+
);
|
|
4080
|
+
}
|
|
4081
|
+
if (!ACCOUNT_MONITOR_SIGNALS.includes(name)) {
|
|
4082
|
+
throw new ValidationError(
|
|
4083
|
+
`'${name}' is not an account_monitor signal. Choose from: ${ACCOUNT_MONITOR_SIGNALS.join(", ")}.`
|
|
4084
|
+
);
|
|
4085
|
+
}
|
|
4086
|
+
if (seen.has(name)) {
|
|
4087
|
+
throw new ValidationError(
|
|
4088
|
+
`The '${name}' signal appears more than once in signalDefinitions \u2014 send each signal once.`
|
|
4089
|
+
);
|
|
4090
|
+
}
|
|
4091
|
+
seen.add(name);
|
|
4092
|
+
for (const key of Object.keys(entry)) {
|
|
4093
|
+
if (key !== "name") {
|
|
4094
|
+
throw new ValidationError(
|
|
4095
|
+
`Unknown signalDefinitions field '${key}'. An account_monitor entry accepts only name.`
|
|
4096
|
+
);
|
|
4097
|
+
}
|
|
4098
|
+
}
|
|
4099
|
+
}
|
|
4100
|
+
}
|
|
4101
|
+
/**
|
|
4102
|
+
* Merge the monitor request the way the backend does: flat `options` fields
|
|
4103
|
+
* first, then the nested params copy, then the dedicated field. A null never
|
|
4104
|
+
* overwrites a value that an earlier source already supplied.
|
|
4105
|
+
*
|
|
4106
|
+
* Only known monitor fields are read out of flat `options`, because general
|
|
4107
|
+
* platform options live there too. The dedicated and nested parameter
|
|
4108
|
+
* objects are strict, so their unknown fields are reported instead.
|
|
4109
|
+
*/
|
|
4110
|
+
_accountMonitorParams(request) {
|
|
4111
|
+
const requestOptions = this._isPlainObject(request.options) ? request.options : {};
|
|
4112
|
+
const nested = this._getParamValue(
|
|
4113
|
+
requestOptions,
|
|
4114
|
+
"specializedAgentParams",
|
|
4115
|
+
"specialized_agent_params"
|
|
4116
|
+
);
|
|
4117
|
+
const strict = [];
|
|
4118
|
+
if (this._isPlainObject(nested))
|
|
4119
|
+
strict.push(nested);
|
|
4120
|
+
if (this._isPlainObject(request.specializedAgentParams))
|
|
4121
|
+
strict.push(request.specializedAgentParams);
|
|
4122
|
+
for (const source of strict) {
|
|
4123
|
+
for (const key of Object.keys(source)) {
|
|
4124
|
+
if (!ACCOUNT_MONITOR_FIELD_KEYS.has(key)) {
|
|
4125
|
+
throw new ValidationError(
|
|
4126
|
+
`Unknown account_monitor parameter '${key}'. This agent accepts only: ${ACCOUNT_MONITOR_FIELDS.map(([camel]) => camel).join(", ")}.`
|
|
4127
|
+
);
|
|
4128
|
+
}
|
|
4129
|
+
}
|
|
4130
|
+
}
|
|
4131
|
+
const merged = {};
|
|
4132
|
+
for (const source of [requestOptions, ...strict]) {
|
|
4133
|
+
for (const [camel, snake] of ACCOUNT_MONITOR_FIELDS) {
|
|
4134
|
+
const value = this._getParamValue(source, camel, snake);
|
|
4135
|
+
if (value !== void 0 && value !== null)
|
|
4136
|
+
merged[camel] = value;
|
|
4137
|
+
}
|
|
4138
|
+
}
|
|
4139
|
+
return merged;
|
|
4140
|
+
}
|
|
3877
4141
|
/**
|
|
3878
4142
|
* Every place a caller may put specialized-agent params: the dedicated field
|
|
3879
4143
|
* and the legacy nested copy inside `options`. Both are validated so a nested
|
|
@@ -4114,6 +4378,10 @@ class ResponsesResource {
|
|
|
4114
4378
|
for (const file of request.files)
|
|
4115
4379
|
this._validateFileReference(file.uri);
|
|
4116
4380
|
}
|
|
4381
|
+
if (request.specializedAgent === "account_monitor") {
|
|
4382
|
+
this._validateAccountMonitorParams(this._accountMonitorParams(request));
|
|
4383
|
+
return this.http.post("/responses", request);
|
|
4384
|
+
}
|
|
4117
4385
|
this._validateSalesNavigatorRequest(request);
|
|
4118
4386
|
for (const params of this._specializedParamSources(request))
|
|
4119
4387
|
this._validateSignalParams(params);
|
|
@@ -4400,32 +4668,33 @@ class ResponsesResource {
|
|
|
4400
4668
|
* - criteria: Generated/reused criteria definitions and classification
|
|
4401
4669
|
*/
|
|
4402
4670
|
async peopleScoring(query, candidateProfiles, options) {
|
|
4671
|
+
const params = {
|
|
4672
|
+
candidateProfiles,
|
|
4673
|
+
deepValidationUseRelevanceReranker: options?.deepValidationUseRelevanceReranker ?? true,
|
|
4674
|
+
deepValidationBackfillBelowCriteria: options?.deepValidationBackfillBelowCriteria ?? true
|
|
4675
|
+
};
|
|
4403
4676
|
const request = {
|
|
4404
4677
|
messages: [{ role: "user", content: query }],
|
|
4405
4678
|
specializedAgent: "people_scoring",
|
|
4406
|
-
specializedAgentParams:
|
|
4407
|
-
candidateProfiles,
|
|
4408
|
-
deepValidationUseRelevanceReranker: options?.deepValidationUseRelevanceReranker ?? true,
|
|
4409
|
-
deepValidationBackfillBelowCriteria: options?.deepValidationBackfillBelowCriteria ?? true
|
|
4410
|
-
}
|
|
4679
|
+
specializedAgentParams: params
|
|
4411
4680
|
};
|
|
4412
4681
|
if (options) {
|
|
4413
4682
|
if (options.reuseCriteriaFrom)
|
|
4414
|
-
|
|
4683
|
+
params.reuseCriteriaFrom = options.reuseCriteriaFrom;
|
|
4415
4684
|
if (options.criteriaDefinitions)
|
|
4416
|
-
|
|
4685
|
+
params.criteriaDefinitions = options.criteriaDefinitions;
|
|
4417
4686
|
if (options.criteriaClassification)
|
|
4418
|
-
|
|
4687
|
+
params.criteriaClassification = options.criteriaClassification;
|
|
4419
4688
|
if (options.runSingleCriterion)
|
|
4420
|
-
|
|
4689
|
+
params.runSingleCriterion = options.runSingleCriterion;
|
|
4421
4690
|
if (options.addCriterion)
|
|
4422
|
-
|
|
4691
|
+
params.addCriterion = options.addCriterion;
|
|
4423
4692
|
if (options.addAndRunCriterion)
|
|
4424
|
-
|
|
4693
|
+
params.addAndRunCriterion = options.addAndRunCriterion;
|
|
4425
4694
|
if (options.deepSearchCriteriaModel)
|
|
4426
|
-
|
|
4695
|
+
params.deepSearchCriteriaModel = options.deepSearchCriteriaModel;
|
|
4427
4696
|
if (options.intentScoringInstructions !== void 0)
|
|
4428
|
-
|
|
4697
|
+
params.intentScoringInstructions = options.intentScoringInstructions;
|
|
4429
4698
|
}
|
|
4430
4699
|
return this.create(request);
|
|
4431
4700
|
}
|
|
@@ -4822,6 +5091,75 @@ class ResponsesResource {
|
|
|
4822
5091
|
specializedAgentParams: params
|
|
4823
5092
|
});
|
|
4824
5093
|
}
|
|
5094
|
+
/**
|
|
5095
|
+
* Report on ONE account for ONE fixed period.
|
|
5096
|
+
*
|
|
5097
|
+
* This runs once, now: there is no backend schedule and no saved cadence, so
|
|
5098
|
+
* call it again when you want the next report. The period defaults to the
|
|
5099
|
+
* last seven days — pass `days` for a different look-back, or `window` for an
|
|
5100
|
+
* exact interval.
|
|
5101
|
+
*
|
|
5102
|
+
* What gets collected is decided ONLY by `signalDefinitions`, or by the
|
|
5103
|
+
* `depth` preset that stands in for it. Nothing is implied: a competitor
|
|
5104
|
+
* string means that company's page, not its employees, and committee work
|
|
5105
|
+
* needs `committee` people plus `depth: 'deep'` or an explicit signal.
|
|
5106
|
+
*
|
|
5107
|
+
* Coverage is always partial and the report says so — a missing record never
|
|
5108
|
+
* proves that nothing happened.
|
|
5109
|
+
*
|
|
5110
|
+
* @param query - What to watch for; it steers the report, not the collection.
|
|
5111
|
+
* Pass an empty string to run the monitor with no steering prompt — the
|
|
5112
|
+
* account, the period and `intentScoringInstructions` are what decide the
|
|
5113
|
+
* report.
|
|
5114
|
+
* @param options - The account, its period, and the explicit scopes to track.
|
|
5115
|
+
* @returns Response; poll with `get()`, read `outputText` for the report and
|
|
5116
|
+
* `structuredResponse` as {@link AccountMonitorOutput}.
|
|
5117
|
+
*
|
|
5118
|
+
* @example
|
|
5119
|
+
* ```ts
|
|
5120
|
+
* await client.responses.accountMonitor(
|
|
5121
|
+
* 'Anything suggesting they are re-evaluating their data warehouse',
|
|
5122
|
+
* {
|
|
5123
|
+
* account: 'acme.com',
|
|
5124
|
+
* days: 14,
|
|
5125
|
+
* depth: 'deep',
|
|
5126
|
+
* committee: { groups: { 'data platform': ['https://www.linkedin.com/in/some-vp'] } },
|
|
5127
|
+
* competitors: [{ company: 'rival.com', employeeTitles: ['Account Executive'] }],
|
|
5128
|
+
* },
|
|
5129
|
+
* )
|
|
5130
|
+
* ```
|
|
5131
|
+
*/
|
|
5132
|
+
async accountMonitor(query, options) {
|
|
5133
|
+
if (typeof query !== "string")
|
|
5134
|
+
throw new ValidationError("accountMonitor query must be a string");
|
|
5135
|
+
const params = { account: options.account };
|
|
5136
|
+
if (options.depth !== void 0)
|
|
5137
|
+
params.depth = options.depth;
|
|
5138
|
+
if (options.committee !== void 0)
|
|
5139
|
+
params.committee = options.committee;
|
|
5140
|
+
if (options.competitors !== void 0)
|
|
5141
|
+
params.competitors = options.competitors;
|
|
5142
|
+
if (options.ourCompany !== void 0)
|
|
5143
|
+
params.ourCompany = options.ourCompany;
|
|
5144
|
+
if (options.days !== void 0)
|
|
5145
|
+
params.days = options.days;
|
|
5146
|
+
if (options.window !== void 0)
|
|
5147
|
+
params.window = options.window;
|
|
5148
|
+
if (options.signalDefinitions !== void 0)
|
|
5149
|
+
params.signalDefinitions = options.signalDefinitions;
|
|
5150
|
+
if (options.intentScoringInstructions !== void 0)
|
|
5151
|
+
params.intentScoringInstructions = options.intentScoringInstructions;
|
|
5152
|
+
if (options.history !== void 0)
|
|
5153
|
+
params.history = options.history;
|
|
5154
|
+
if (options.tier !== void 0)
|
|
5155
|
+
params.tier = options.tier;
|
|
5156
|
+
const prompt = query.trim() || `Account monitor report for ${options.account}`;
|
|
5157
|
+
return this.create({
|
|
5158
|
+
messages: [{ role: "user", content: prompt }],
|
|
5159
|
+
specializedAgent: "account_monitor",
|
|
5160
|
+
specializedAgentParams: params
|
|
5161
|
+
});
|
|
5162
|
+
}
|
|
4825
5163
|
}
|
|
4826
5164
|
|
|
4827
5165
|
class SequencesResource {
|