lumnisai 0.5.31 → 0.5.33

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
@@ -3366,6 +3366,62 @@ class ResponsesResource {
3366
3366
  throw new ValidationError("maxEngagementsPerRep must be between 1 and 1000");
3367
3367
  }
3368
3368
  }
3369
+ _validateContentIntelligenceParams(params) {
3370
+ const limit = this._getParamValue(params, "limit", "limit");
3371
+ if (limit !== void 0 && (!Number.isInteger(limit) || limit < 1 || limit > 1e3))
3372
+ throw new ValidationError("limit must be an integer between 1 and 1000 for content_intelligence");
3373
+ const exaResultsPerQuery = this._getParamValue(
3374
+ params,
3375
+ "exaResultsPerQuery",
3376
+ "exa_results_per_query"
3377
+ );
3378
+ if (exaResultsPerQuery !== void 0 && (!Number.isInteger(exaResultsPerQuery) || exaResultsPerQuery < 1)) {
3379
+ throw new ValidationError("exaResultsPerQuery must be a positive integer");
3380
+ }
3381
+ const outputs = this._getParamValue(params, "outputs", "outputs");
3382
+ if (outputs !== void 0) {
3383
+ if (!Array.isArray(outputs) || outputs.length === 0)
3384
+ throw new ValidationError("outputs must contain at least one value");
3385
+ const supported = [
3386
+ "top_posts",
3387
+ "post_ideas",
3388
+ "engagement_analysis"
3389
+ ];
3390
+ for (const output of outputs) {
3391
+ if (!supported.includes(output)) {
3392
+ throw new ValidationError(
3393
+ `Invalid content_intelligence output: ${String(output)}. Supported outputs: ${supported.join(", ")}.`
3394
+ );
3395
+ }
3396
+ }
3397
+ }
3398
+ }
3399
+ _validateEngagementExpansionParams(params) {
3400
+ const expandFromResponse = this._getParamValue(
3401
+ params,
3402
+ "expandFromResponse",
3403
+ "expand_from_response"
3404
+ );
3405
+ if (typeof expandFromResponse !== "string" || !expandFromResponse.trim()) {
3406
+ throw new ValidationError(
3407
+ "expandFromResponse is required for engagement_expansion and must be a non-empty string"
3408
+ );
3409
+ }
3410
+ for (const [camel, snake] of [
3411
+ ["hops", "hops"],
3412
+ ["postsPerHop", "posts_per_hop"],
3413
+ ["peoplePerNextHop", "people_per_next_hop"],
3414
+ ["limit", "limit"]
3415
+ ]) {
3416
+ const value = this._getParamValue(params, camel, snake);
3417
+ if (value !== void 0 && (!Number.isInteger(value) || value < 1))
3418
+ throw new ValidationError(`${camel} must be a positive integer for engagement_expansion`);
3419
+ }
3420
+ const excludeUrls = this._getParamValue(params, "excludeUrls", "exclude_urls");
3421
+ if (excludeUrls !== void 0 && (!Array.isArray(excludeUrls) || excludeUrls.some((url) => typeof url !== "string"))) {
3422
+ throw new ValidationError("excludeUrls must be an array of strings for engagement_expansion");
3423
+ }
3424
+ }
3369
3425
  _validateCriteriaParams(params, specializedAgent) {
3370
3426
  if (!params)
3371
3427
  return;
@@ -3477,6 +3533,10 @@ class ResponsesResource {
3477
3533
  this._validateCompetitorPostEngagementParams(rawParams);
3478
3534
  if (specializedAgent === "competitor_rep_engagement")
3479
3535
  this._validateCompetitorRepEngagementParams(rawParams);
3536
+ if (specializedAgent === "content_intelligence")
3537
+ this._validateContentIntelligenceParams(rawParams);
3538
+ if (specializedAgent === "engagement_expansion")
3539
+ this._validateEngagementExpansionParams(rawParams);
3480
3540
  }
3481
3541
  _validateFileReference(uri) {
3482
3542
  if (uri.startsWith("artifact_"))
@@ -3791,6 +3851,80 @@ class ResponsesResource {
3791
3851
  }
3792
3852
  return this.create(request);
3793
3853
  }
3854
+ /**
3855
+ * Discover what content a described audience engages with on LinkedIn.
3856
+ *
3857
+ * The backend searches for the audience, collects their reaction history,
3858
+ * saves the normalized package, and produces grounded views from it. Pass
3859
+ * `reusePackageFrom` to re-cook a saved package without collecting again.
3860
+ *
3861
+ * @param query - Natural-language description of the audience. A nonblank
3862
+ * message is required even when reusing a package.
3863
+ * @param options - Audience, collection-window, package-reuse, and output controls.
3864
+ * Omit `outputs` to use the backend's default set.
3865
+ */
3866
+ async contentIntelligence(query, options = {}) {
3867
+ if (!query.trim())
3868
+ throw new ValidationError("contentIntelligence requires a non-empty audience query");
3869
+ const params = {};
3870
+ if (options.limit !== void 0)
3871
+ params.limit = options.limit;
3872
+ if (options.postsDateRange !== void 0)
3873
+ params.postsDateRange = options.postsDateRange;
3874
+ if (options.postsEnableFiltering !== void 0)
3875
+ params.postsEnableFiltering = options.postsEnableFiltering;
3876
+ if (options.exaResultsPerQuery !== void 0)
3877
+ params.exaResultsPerQuery = options.exaResultsPerQuery;
3878
+ if (options.reusePackageFrom !== void 0)
3879
+ params.reusePackageFrom = options.reusePackageFrom;
3880
+ if (options.outputs !== void 0)
3881
+ params.outputs = options.outputs;
3882
+ return this.create({
3883
+ messages: [{ role: "user", content: query }],
3884
+ specializedAgent: "content_intelligence",
3885
+ specializedAgentParams: params
3886
+ });
3887
+ }
3888
+ /**
3889
+ * Find new people by walking outward from a saved content-intelligence package.
3890
+ *
3891
+ * Hop 1 pulls the other engagers of the package's best posts. Additional hops
3892
+ * select the highest-fit new people, rank posts from their feeds, and pull the
3893
+ * engagers of those posts. Collection breadth is derived from `limit` unless
3894
+ * `postsPerHop` is set explicitly. At the default limit, collection is about
3895
+ * 300 credits for one hop and 1,060 for three hops; enrichment and validation
3896
+ * use the standard deep-search economics on top.
3897
+ *
3898
+ * @param query - Persona prompt used to rank and validate discovered people.
3899
+ * @param options - Source response plus hop, breadth, limit, and exclusion controls.
3900
+ * @returns Response; poll with `get()` and read `structuredResponse` as
3901
+ * {@link EngagementExpansionOutput}.
3902
+ */
3903
+ async engagementExpansion(query, options) {
3904
+ if (!query.trim())
3905
+ throw new ValidationError("engagementExpansion requires a non-empty persona query");
3906
+ const params = {
3907
+ expandFromResponse: options?.expandFromResponse
3908
+ };
3909
+ if (options?.hops !== void 0)
3910
+ params.hops = options.hops;
3911
+ if (options?.postsPerHop !== void 0)
3912
+ params.postsPerHop = options.postsPerHop;
3913
+ if (options?.peoplePerNextHop !== void 0)
3914
+ params.peoplePerNextHop = options.peoplePerNextHop;
3915
+ if (options?.limit !== void 0)
3916
+ params.limit = options.limit;
3917
+ if (options?.excludeUrls !== void 0)
3918
+ params.excludeUrls = options.excludeUrls;
3919
+ if (options?.deepValidationUseRelevanceReranker !== void 0) {
3920
+ params.deepValidationUseRelevanceReranker = options.deepValidationUseRelevanceReranker;
3921
+ }
3922
+ return this.create({
3923
+ messages: [{ role: "user", content: query }],
3924
+ specializedAgent: "engagement_expansion",
3925
+ specializedAgentParams: params
3926
+ });
3927
+ }
3794
3928
  /**
3795
3929
  * Score people who reacted to or commented on competitor LinkedIn posts.
3796
3930
  *