lumnisai 0.5.47 → 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 CHANGED
@@ -1934,12 +1934,23 @@ function toSnake(s) {
1934
1934
  return index === 0 ? letter.toLowerCase() : `_${letter.toLowerCase()}`;
1935
1935
  });
1936
1936
  }
1937
+ const PASSTHROUGH_VALUE_KEYS = /* @__PURE__ */ new Set([
1938
+ "customFields",
1939
+ "custom_fields",
1940
+ "engagementProfile",
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"
1947
+ ]);
1937
1948
  function convertCase(obj, converter) {
1938
1949
  if (Array.isArray(obj)) {
1939
1950
  return obj.map((v) => convertCase(v, converter));
1940
1951
  } else if (obj !== null && typeof obj === "object") {
1941
1952
  return Object.keys(obj).reduce((acc, key) => {
1942
- const value = key === "customFields" || key === "custom_fields" ? obj[key] : convertCase(obj[key], converter);
1953
+ const value = PASSTHROUGH_VALUE_KEYS.has(key) ? obj[key] : convertCase(obj[key], converter);
1943
1954
  acc[converter(key)] = value;
1944
1955
  return acc;
1945
1956
  }, {});
@@ -3250,6 +3261,38 @@ const ENGAGEMENT_ACTIVITIES = [
3250
3261
  "comments",
3251
3262
  "authored_posts"
3252
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());
3253
3296
  const MAX_SIGNAL_CONTEXT_CHARS = 4e3;
3254
3297
  const MAX_CONTENT_INTELLIGENCE_COMPETITORS = 5;
3255
3298
  const MAX_CONTENT_INTELLIGENCE_COMPETITOR_CHARS = 200;
@@ -3669,7 +3712,8 @@ class ResponsesResource {
3669
3712
  }
3670
3713
  for (const [camel, snake] of [
3671
3714
  ["includeCompanyPosts", "include_company_posts"],
3672
- ["includeExecPosts", "include_exec_posts"]
3715
+ ["includeExecPosts", "include_exec_posts"],
3716
+ ["includeMentionPosts", "include_mention_posts"]
3673
3717
  ]) {
3674
3718
  const value = this._getParamValue(params, camel, snake);
3675
3719
  if (value !== void 0 && typeof value !== "boolean")
@@ -3685,11 +3729,24 @@ class ResponsesResource {
3685
3729
  "includeExecPosts",
3686
3730
  "include_exec_posts"
3687
3731
  );
3688
- if (competitors.length > 0 && includeCompanyPosts === false && includeExecPosts === false) {
3732
+ const includeMentionPosts = this._getParamValue(
3733
+ params,
3734
+ "includeMentionPosts",
3735
+ "include_mention_posts"
3736
+ );
3737
+ if (competitors.length > 0 && includeCompanyPosts === false && includeExecPosts === false && includeMentionPosts === false) {
3689
3738
  throw new ValidationError(
3690
- "competitors were provided but includeCompanyPosts and includeExecPosts are both false"
3739
+ "competitors were provided but includeCompanyPosts, includeExecPosts, and includeMentionPosts are all false"
3691
3740
  );
3692
3741
  }
3742
+ const maxMentionsPerTarget = this._getParamValue(
3743
+ params,
3744
+ "maxMentionsPerTarget",
3745
+ "max_mentions_per_target"
3746
+ );
3747
+ if (maxMentionsPerTarget !== void 0 && (!Number.isInteger(maxMentionsPerTarget) || maxMentionsPerTarget < 1 || maxMentionsPerTarget > 500)) {
3748
+ throw new ValidationError("maxMentionsPerTarget must be an integer between 1 and 500");
3749
+ }
3693
3750
  const execTitles = this._getParamValue(params, "execTitles", "exec_titles");
3694
3751
  if (execTitles !== void 0 && (!Array.isArray(execTitles) || execTitles.some((title) => typeof title !== "string"))) {
3695
3752
  throw new ValidationError("execTitles must be an array of strings");
@@ -3854,6 +3911,233 @@ class ResponsesResource {
3854
3911
  );
3855
3912
  }
3856
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
+ }
3857
4141
  /**
3858
4142
  * Every place a caller may put specialized-agent params: the dedicated field
3859
4143
  * and the legacy nested copy inside `options`. Both are validated so a nested
@@ -4094,6 +4378,10 @@ class ResponsesResource {
4094
4378
  for (const file of request.files)
4095
4379
  this._validateFileReference(file.uri);
4096
4380
  }
4381
+ if (request.specializedAgent === "account_monitor") {
4382
+ this._validateAccountMonitorParams(this._accountMonitorParams(request));
4383
+ return this.http.post("/responses", request);
4384
+ }
4097
4385
  this._validateSalesNavigatorRequest(request);
4098
4386
  for (const params of this._specializedParamSources(request))
4099
4387
  this._validateSignalParams(params);
@@ -4380,32 +4668,33 @@ class ResponsesResource {
4380
4668
  * - criteria: Generated/reused criteria definitions and classification
4381
4669
  */
4382
4670
  async peopleScoring(query, candidateProfiles, options) {
4671
+ const params = {
4672
+ candidateProfiles,
4673
+ deepValidationUseRelevanceReranker: options?.deepValidationUseRelevanceReranker ?? true,
4674
+ deepValidationBackfillBelowCriteria: options?.deepValidationBackfillBelowCriteria ?? true
4675
+ };
4383
4676
  const request = {
4384
4677
  messages: [{ role: "user", content: query }],
4385
4678
  specializedAgent: "people_scoring",
4386
- specializedAgentParams: {
4387
- candidateProfiles,
4388
- deepValidationUseRelevanceReranker: options?.deepValidationUseRelevanceReranker ?? true,
4389
- deepValidationBackfillBelowCriteria: options?.deepValidationBackfillBelowCriteria ?? true
4390
- }
4679
+ specializedAgentParams: params
4391
4680
  };
4392
4681
  if (options) {
4393
4682
  if (options.reuseCriteriaFrom)
4394
- request.specializedAgentParams.reuseCriteriaFrom = options.reuseCriteriaFrom;
4683
+ params.reuseCriteriaFrom = options.reuseCriteriaFrom;
4395
4684
  if (options.criteriaDefinitions)
4396
- request.specializedAgentParams.criteriaDefinitions = options.criteriaDefinitions;
4685
+ params.criteriaDefinitions = options.criteriaDefinitions;
4397
4686
  if (options.criteriaClassification)
4398
- request.specializedAgentParams.criteriaClassification = options.criteriaClassification;
4687
+ params.criteriaClassification = options.criteriaClassification;
4399
4688
  if (options.runSingleCriterion)
4400
- request.specializedAgentParams.runSingleCriterion = options.runSingleCriterion;
4689
+ params.runSingleCriterion = options.runSingleCriterion;
4401
4690
  if (options.addCriterion)
4402
- request.specializedAgentParams.addCriterion = options.addCriterion;
4691
+ params.addCriterion = options.addCriterion;
4403
4692
  if (options.addAndRunCriterion)
4404
- request.specializedAgentParams.addAndRunCriterion = options.addAndRunCriterion;
4693
+ params.addAndRunCriterion = options.addAndRunCriterion;
4405
4694
  if (options.deepSearchCriteriaModel)
4406
- request.specializedAgentParams.deepSearchCriteriaModel = options.deepSearchCriteriaModel;
4695
+ params.deepSearchCriteriaModel = options.deepSearchCriteriaModel;
4407
4696
  if (options.intentScoringInstructions !== void 0)
4408
- request.specializedAgentParams.intentScoringInstructions = options.intentScoringInstructions;
4697
+ params.intentScoringInstructions = options.intentScoringInstructions;
4409
4698
  }
4410
4699
  return this.create(request);
4411
4700
  }
@@ -4455,6 +4744,10 @@ class ResponsesResource {
4455
4744
  params.includeCompanyPosts = options.includeCompanyPosts;
4456
4745
  if (options.includeExecPosts !== void 0)
4457
4746
  params.includeExecPosts = options.includeExecPosts;
4747
+ if (options.includeMentionPosts !== void 0)
4748
+ params.includeMentionPosts = options.includeMentionPosts;
4749
+ if (options.maxMentionsPerTarget !== void 0)
4750
+ params.maxMentionsPerTarget = options.maxMentionsPerTarget;
4458
4751
  if (options.execTitles !== void 0)
4459
4752
  params.execTitles = options.execTitles;
4460
4753
  if (options.maxExecsPerTarget !== void 0)
@@ -4798,6 +5091,75 @@ class ResponsesResource {
4798
5091
  specializedAgentParams: params
4799
5092
  });
4800
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
+ }
4801
5163
  }
4802
5164
 
4803
5165
  class SequencesResource {