@graphext/cuery 0.4.0 → 0.5.2
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/esm/browser.d.ts +1 -1
- package/esm/browser.d.ts.map +1 -1
- package/esm/browser.js +1 -1
- package/esm/mod.d.ts +5 -2
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +7 -2
- package/esm/src/api.d.ts +36 -5
- package/esm/src/api.d.ts.map +1 -1
- package/esm/src/api.js +84 -37
- package/esm/src/apis/chatgptScraper/brightdata.js +1 -1
- package/esm/src/apis/chatgptScraper/oxy.js +1 -1
- package/esm/src/apis/chatgptScraper/scraper.js +2 -2
- package/esm/src/apis/hasdata/aim.js +1 -1
- package/esm/src/apis/hasdata/aio.js +1 -1
- package/esm/src/apis/hasdata/helpers.d.ts +1 -1
- package/esm/src/apis/hasdata/helpers.d.ts.map +1 -1
- package/esm/src/apis/hasdata/helpers.js +2 -2
- package/esm/src/assets/models.d.ts +60725 -0
- package/esm/src/assets/models.d.ts.map +1 -0
- package/esm/src/assets/models.js +71915 -0
- package/esm/src/helpers/async.d.ts.map +1 -0
- package/esm/src/{async.js → helpers/async.js} +1 -1
- package/esm/src/helpers/seedKeywords.d.ts.map +1 -0
- package/esm/src/helpers/urls.d.ts.map +1 -0
- package/esm/src/helpers/utils.d.ts.map +1 -0
- package/esm/src/llm.d.ts +35 -0
- package/esm/src/llm.d.ts.map +1 -0
- package/esm/src/llm.js +59 -0
- package/esm/src/providers/google.d.ts +12 -0
- package/esm/src/providers/google.d.ts.map +1 -0
- package/esm/src/providers/google.js +111 -0
- package/esm/src/providers/index.d.ts +13 -0
- package/esm/src/providers/index.d.ts.map +1 -0
- package/esm/src/providers/index.js +14 -0
- package/esm/src/providers/openai.d.ts +12 -0
- package/esm/src/providers/openai.d.ts.map +1 -0
- package/esm/src/providers/openai.js +141 -0
- package/esm/src/providers/pricing.d.ts +72 -0
- package/esm/src/providers/pricing.d.ts.map +1 -0
- package/esm/src/providers/pricing.js +88 -0
- package/esm/src/providers/registry.d.ts +20 -0
- package/esm/src/providers/registry.d.ts.map +1 -0
- package/esm/src/providers/registry.js +35 -0
- package/esm/src/providers/types.d.ts +49 -0
- package/esm/src/providers/types.d.ts.map +1 -0
- package/esm/src/providers/types.js +7 -0
- package/esm/src/response.d.ts +74 -0
- package/esm/src/response.d.ts.map +1 -0
- package/esm/src/response.js +110 -0
- package/esm/src/tool.d.ts +58 -0
- package/esm/src/tool.d.ts.map +1 -0
- package/esm/src/tool.js +91 -0
- package/esm/src/tools/brands.js +6 -6
- package/esm/src/tools/classifier.d.ts +80 -17
- package/esm/src/tools/classifier.d.ts.map +1 -1
- package/esm/src/tools/classifier.js +68 -80
- package/esm/src/tools/entities.d.ts +23 -12
- package/esm/src/tools/entities.d.ts.map +1 -1
- package/esm/src/tools/entities.js +27 -47
- package/esm/src/tools/funnel.js +7 -7
- package/esm/src/tools/generic.d.ts +17 -4
- package/esm/src/tools/generic.d.ts.map +1 -1
- package/esm/src/tools/generic.js +39 -14
- package/esm/src/tools/keywords.js +5 -5
- package/esm/src/tools/personas.d.ts +49 -2
- package/esm/src/tools/personas.d.ts.map +1 -1
- package/esm/src/tools/personas.js +59 -35
- package/esm/src/tools/scorer.d.ts +24 -6
- package/esm/src/tools/scorer.d.ts.map +1 -1
- package/esm/src/tools/scorer.js +27 -22
- package/esm/src/tools/search.d.ts.map +1 -1
- package/esm/src/tools/search.js +33 -9
- package/esm/src/tools/sentiment.d.ts +30 -8
- package/esm/src/tools/sentiment.d.ts.map +1 -1
- package/esm/src/tools/sentiment.js +33 -28
- package/esm/src/tools/sources.d.ts +5 -5
- package/esm/src/tools/sources.d.ts.map +1 -1
- package/esm/src/tools/sources.js +5 -6
- package/esm/src/tools/topics.d.ts +44 -16
- package/esm/src/tools/topics.d.ts.map +1 -1
- package/esm/src/tools/topics.js +77 -68
- package/esm/src/tools/translate.d.ts +22 -31
- package/esm/src/tools/translate.d.ts.map +1 -1
- package/esm/src/tools/translate.js +40 -36
- package/package.json +2 -1
- package/script/browser.d.ts +1 -1
- package/script/browser.d.ts.map +1 -1
- package/script/browser.js +1 -1
- package/script/mod.d.ts +5 -2
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +14 -2
- package/script/src/api.d.ts +36 -5
- package/script/src/api.d.ts.map +1 -1
- package/script/src/api.js +84 -35
- package/script/src/apis/chatgptScraper/brightdata.js +1 -1
- package/script/src/apis/chatgptScraper/oxy.js +1 -1
- package/script/src/apis/chatgptScraper/scraper.js +2 -2
- package/script/src/apis/hasdata/aim.js +1 -1
- package/script/src/apis/hasdata/aio.js +1 -1
- package/script/src/apis/hasdata/helpers.d.ts +1 -1
- package/script/src/apis/hasdata/helpers.d.ts.map +1 -1
- package/script/src/apis/hasdata/helpers.js +2 -2
- package/script/src/assets/models.d.ts +60725 -0
- package/script/src/assets/models.d.ts.map +1 -0
- package/script/src/assets/models.js +71917 -0
- package/script/src/helpers/async.d.ts.map +1 -0
- package/script/src/{async.js → helpers/async.js} +1 -1
- package/script/src/helpers/seedKeywords.d.ts.map +1 -0
- package/script/src/helpers/urls.d.ts.map +1 -0
- package/script/src/helpers/utils.d.ts.map +1 -0
- package/script/src/llm.d.ts +35 -0
- package/script/src/llm.d.ts.map +1 -0
- package/script/src/llm.js +65 -0
- package/script/src/providers/google.d.ts +12 -0
- package/script/src/providers/google.d.ts.map +1 -0
- package/script/src/providers/google.js +148 -0
- package/script/src/providers/index.d.ts +13 -0
- package/script/src/providers/index.d.ts.map +1 -0
- package/script/src/providers/index.js +24 -0
- package/script/src/providers/openai.d.ts +12 -0
- package/script/src/providers/openai.d.ts.map +1 -0
- package/script/src/providers/openai.js +181 -0
- package/script/src/providers/pricing.d.ts +72 -0
- package/script/src/providers/pricing.d.ts.map +1 -0
- package/script/src/providers/pricing.js +97 -0
- package/script/src/providers/registry.d.ts +20 -0
- package/script/src/providers/registry.d.ts.map +1 -0
- package/script/src/providers/registry.js +39 -0
- package/script/src/providers/types.d.ts +49 -0
- package/script/src/providers/types.d.ts.map +1 -0
- package/script/src/providers/types.js +8 -0
- package/script/src/response.d.ts +74 -0
- package/script/src/response.d.ts.map +1 -0
- package/script/src/response.js +114 -0
- package/script/src/tool.d.ts +58 -0
- package/script/src/tool.d.ts.map +1 -0
- package/script/src/tool.js +95 -0
- package/script/src/tools/brands.js +6 -6
- package/script/src/tools/classifier.d.ts +80 -17
- package/script/src/tools/classifier.d.ts.map +1 -1
- package/script/src/tools/classifier.js +72 -85
- package/script/src/tools/entities.d.ts +23 -12
- package/script/src/tools/entities.d.ts.map +1 -1
- package/script/src/tools/entities.js +29 -51
- package/script/src/tools/funnel.js +7 -7
- package/script/src/tools/generic.d.ts +17 -4
- package/script/src/tools/generic.d.ts.map +1 -1
- package/script/src/tools/generic.js +39 -14
- package/script/src/tools/keywords.js +5 -5
- package/script/src/tools/personas.d.ts +49 -2
- package/script/src/tools/personas.d.ts.map +1 -1
- package/script/src/tools/personas.js +63 -36
- package/script/src/tools/scorer.d.ts +24 -6
- package/script/src/tools/scorer.d.ts.map +1 -1
- package/script/src/tools/scorer.js +28 -24
- package/script/src/tools/search.d.ts.map +1 -1
- package/script/src/tools/search.js +69 -9
- package/script/src/tools/sentiment.d.ts +30 -8
- package/script/src/tools/sentiment.d.ts.map +1 -1
- package/script/src/tools/sentiment.js +37 -30
- package/script/src/tools/sources.d.ts +5 -5
- package/script/src/tools/sources.d.ts.map +1 -1
- package/script/src/tools/sources.js +4 -5
- package/script/src/tools/topics.d.ts +44 -16
- package/script/src/tools/topics.d.ts.map +1 -1
- package/script/src/tools/topics.js +80 -72
- package/script/src/tools/translate.d.ts +22 -31
- package/script/src/tools/translate.d.ts.map +1 -1
- package/script/src/tools/translate.js +43 -40
- package/esm/src/async.d.ts.map +0 -1
- package/esm/src/models.d.ts +0 -18
- package/esm/src/models.d.ts.map +0 -1
- package/esm/src/models.js +0 -48
- package/esm/src/openai.d.ts +0 -17
- package/esm/src/openai.d.ts.map +0 -1
- package/esm/src/openai.js +0 -136
- package/esm/src/tools/seedKeywords.d.ts.map +0 -1
- package/esm/src/urls.d.ts.map +0 -1
- package/esm/src/utils.d.ts.map +0 -1
- package/script/src/async.d.ts.map +0 -1
- package/script/src/models.d.ts +0 -18
- package/script/src/models.d.ts.map +0 -1
- package/script/src/models.js +0 -52
- package/script/src/openai.d.ts +0 -17
- package/script/src/openai.d.ts.map +0 -1
- package/script/src/openai.js +0 -175
- package/script/src/tools/seedKeywords.d.ts.map +0 -1
- package/script/src/urls.d.ts.map +0 -1
- package/script/src/utils.d.ts.map +0 -1
- /package/esm/src/{async.d.ts → helpers/async.d.ts} +0 -0
- /package/esm/src/{tools → helpers}/seedKeywords.d.ts +0 -0
- /package/esm/src/{tools → helpers}/seedKeywords.js +0 -0
- /package/esm/src/{urls.d.ts → helpers/urls.d.ts} +0 -0
- /package/esm/src/{urls.js → helpers/urls.js} +0 -0
- /package/esm/src/{utils.d.ts → helpers/utils.d.ts} +0 -0
- /package/esm/src/{utils.js → helpers/utils.js} +0 -0
- /package/script/src/{async.d.ts → helpers/async.d.ts} +0 -0
- /package/script/src/{tools → helpers}/seedKeywords.d.ts +0 -0
- /package/script/src/{tools → helpers}/seedKeywords.js +0 -0
- /package/script/src/{urls.d.ts → helpers/urls.d.ts} +0 -0
- /package/script/src/{urls.js → helpers/urls.js} +0 -0
- /package/script/src/{utils.d.ts → helpers/utils.d.ts} +0 -0
- /package/script/src/{utils.js → helpers/utils.js} +0 -0
package/esm/browser.d.ts
CHANGED
package/esm/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,wBAAwB,CAAC;AAGvC,cAAc,
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,wBAAwB,CAAC;AAGvC,cAAc,+BAA+B,CAAC"}
|
package/esm/browser.js
CHANGED
package/esm/mod.d.ts
CHANGED
|
@@ -3,19 +3,22 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
+
export * from './src/llm.js';
|
|
7
|
+
export { BatchResponse } from './src/response.js';
|
|
8
|
+
export { getProvider, getProviderForModel, getModelPricing, getModelInfo, calculateCost, type ModelPricing, type ModelInfo, } from './src/providers/index.js';
|
|
6
9
|
export * from './src/tools/keywords.js';
|
|
7
10
|
export * from './src/tools/classifier.js';
|
|
8
11
|
export * from './src/tools/funnel.js';
|
|
9
12
|
export * from './src/tools/personas.js';
|
|
10
13
|
export * from './src/tools/search.js';
|
|
11
14
|
export * from './src/tools/topics.js';
|
|
12
|
-
export * from './src/utils.js';
|
|
15
|
+
export * from './src/helpers/utils.js';
|
|
13
16
|
export * from './src/tools/brands.js';
|
|
14
17
|
export * from './src/tools/translate.js';
|
|
15
18
|
export * from './src/tools/sentiment.js';
|
|
16
19
|
export * from './src/tools/sources.js';
|
|
17
20
|
export * from './src/tools/entities.js';
|
|
18
|
-
export * from './src/
|
|
21
|
+
export * from './src/helpers/seedKeywords.js';
|
|
19
22
|
export * from './src/tools/generic.js';
|
|
20
23
|
export * from './src/api.js';
|
|
21
24
|
export * from './src/apis/chatgptScraper/index.js';
|
package/esm/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
|
package/esm/mod.js
CHANGED
|
@@ -3,19 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
+
// Core LLM interface and types
|
|
7
|
+
export * from './src/llm.js';
|
|
8
|
+
export { BatchResponse } from './src/response.js';
|
|
9
|
+
export { getProvider, getProviderForModel, getModelPricing, getModelInfo, calculateCost, } from './src/providers/index.js';
|
|
10
|
+
// Tools
|
|
6
11
|
export * from './src/tools/keywords.js';
|
|
7
12
|
export * from './src/tools/classifier.js';
|
|
8
13
|
export * from './src/tools/funnel.js';
|
|
9
14
|
export * from './src/tools/personas.js';
|
|
10
15
|
export * from './src/tools/search.js';
|
|
11
16
|
export * from './src/tools/topics.js';
|
|
12
|
-
export * from './src/utils.js';
|
|
17
|
+
export * from './src/helpers/utils.js';
|
|
13
18
|
export * from './src/tools/brands.js';
|
|
14
19
|
export * from './src/tools/translate.js';
|
|
15
20
|
export * from './src/tools/sentiment.js';
|
|
16
21
|
export * from './src/tools/sources.js';
|
|
17
22
|
export * from './src/tools/entities.js';
|
|
18
|
-
export * from './src/
|
|
23
|
+
export * from './src/helpers/seedKeywords.js';
|
|
19
24
|
export * from './src/tools/generic.js';
|
|
20
25
|
export * from './src/api.js';
|
|
21
26
|
export * from './src/apis/chatgptScraper/index.js';
|
package/esm/src/api.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type JobId } from './apis/chatgptScraper/index.js';
|
|
2
|
-
import { ModelId } from './models.js';
|
|
3
2
|
import { type Entity } from './schemas/entity.schema.js';
|
|
4
3
|
import { type Funnel } from './schemas/funnel.schema.js';
|
|
5
4
|
import type { ModelIdentifier } from './schemas/models.schema.js';
|
|
@@ -24,8 +23,40 @@ export type EnrichedModelResponse = {
|
|
|
24
23
|
rankedBrandsInSourceTitles: Array<string>;
|
|
25
24
|
rankedBrandsInSourceDomains: Array<string>;
|
|
26
25
|
};
|
|
27
|
-
export declare function queryModel(prompts: Array<string | JobId>, model: ModelIdentifier
|
|
26
|
+
export declare function queryModel(prompts: Array<string | JobId>, model: ModelIdentifier, searchCountry?: string | null): Promise<Array<ModelResponse>>;
|
|
28
27
|
export declare function classifyIntent(texts: Array<string>): Promise<Array<string | null>>;
|
|
28
|
+
export declare function extractTopics(params: {
|
|
29
|
+
records: Array<Record<string, unknown>>;
|
|
30
|
+
maxSamples?: number;
|
|
31
|
+
instructions?: string;
|
|
32
|
+
language?: string;
|
|
33
|
+
model?: string;
|
|
34
|
+
}): Promise<{
|
|
35
|
+
topics: {
|
|
36
|
+
topic: string;
|
|
37
|
+
subtopics: string[];
|
|
38
|
+
}[];
|
|
39
|
+
} | null>;
|
|
40
|
+
export declare function generatePersonas(params: {
|
|
41
|
+
sector: string;
|
|
42
|
+
market: string;
|
|
43
|
+
language: string;
|
|
44
|
+
brand?: string;
|
|
45
|
+
brandDomain?: string;
|
|
46
|
+
count?: number;
|
|
47
|
+
briefing?: string;
|
|
48
|
+
instructions?: string;
|
|
49
|
+
userLanguage?: string;
|
|
50
|
+
personas?: Array<Persona>;
|
|
51
|
+
model?: string;
|
|
52
|
+
}): Promise<{
|
|
53
|
+
personas: {
|
|
54
|
+
name: string;
|
|
55
|
+
description: string;
|
|
56
|
+
keywordSeeds: string[];
|
|
57
|
+
}[];
|
|
58
|
+
explanation: string;
|
|
59
|
+
} | null>;
|
|
29
60
|
export declare function extractAndAssignTopics(texts: Array<string>): Promise<Array<{
|
|
30
61
|
topic: string | null;
|
|
31
62
|
subtopic: string | null;
|
|
@@ -36,7 +67,7 @@ export declare function assignFunnelStages(texts: Array<string>, funnel: Funnel)
|
|
|
36
67
|
}>>;
|
|
37
68
|
export declare function classifyIntoPersonas(texts: Array<string>, personas: Array<Persona>): Promise<Array<Array<string> | null>>;
|
|
38
69
|
export declare function classifyBrandedNonBranded(texts: Array<string>): Promise<Array<string | null>>;
|
|
39
|
-
export declare function extractEntities(texts: Array<string>): Promise<Array<Array<Entity
|
|
40
|
-
export declare function scorePurchaseProbability(texts: Array<string>, numDays?: number): Promise<Array<number>>;
|
|
41
|
-
export declare function scoreRelevance(prompts: Array<string>, context: BrandContext): Promise<Array<number>>;
|
|
70
|
+
export declare function extractEntities(texts: Array<string>): Promise<Array<Array<Entity> | null>>;
|
|
71
|
+
export declare function scorePurchaseProbability(texts: Array<string>, numDays?: number): Promise<Array<number | null>>;
|
|
72
|
+
export declare function scoreRelevance(prompts: Array<string>, context: BrandContext): Promise<Array<number | null>>;
|
|
42
73
|
//# sourceMappingURL=api.d.ts.map
|
package/esm/src/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/src/api.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAIlG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/src/api.ts"],"names":[],"mappings":"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"}
|
package/esm/src/api.js
CHANGED
|
@@ -2,23 +2,23 @@
|
|
|
2
2
|
import { fetchAIMBatch } from './apis/hasdata/aim.js';
|
|
3
3
|
import { fetchAIOBatch } from './apis/hasdata/aio.js';
|
|
4
4
|
import { downloadGPTSnapshots, scrapeGPTBatch } from './apis/chatgptScraper/index.js';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { Classifier, Labeler } from './tools/classifier.js';
|
|
6
|
+
import { EntityExtractor } from './tools/entities.js';
|
|
7
7
|
import { funnelToTopics } from './tools/funnel.js';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
8
|
+
import { cleanColumnName } from './helpers/utils.js';
|
|
9
|
+
import { Scorer } from './tools/scorer.js';
|
|
10
|
+
import { TopicExtractor, TopicAssigner } from './tools/topics.js';
|
|
11
|
+
import { PersonaGenerator } from './tools/personas.js';
|
|
12
|
+
import { dedent } from './helpers/utils.js';
|
|
12
13
|
export async function queryModel(prompts, model, searchCountry = null) {
|
|
13
|
-
const modelId = model instanceof ModelId ? model : new ModelId(model);
|
|
14
14
|
let searchResults;
|
|
15
|
-
if (
|
|
15
|
+
if (model === 'google/ai-overview') {
|
|
16
16
|
searchResults = await fetchAIOBatch(prompts, searchCountry, null);
|
|
17
17
|
}
|
|
18
|
-
else if (
|
|
18
|
+
else if (model === 'google/ai-mode') {
|
|
19
19
|
searchResults = await fetchAIMBatch(prompts, searchCountry, null);
|
|
20
20
|
}
|
|
21
|
-
else if (
|
|
21
|
+
else if (model.startsWith('openai/') || model.includes('chatgpt')) {
|
|
22
22
|
// JobIds are alphanumeric strings without spaces
|
|
23
23
|
// (e.g., "7420410504197219329" for Oxylabs, "s_xxxxx" for Brightdata)
|
|
24
24
|
// Prompts are natural language text with spaces
|
|
@@ -35,13 +35,15 @@ export async function queryModel(prompts, model, searchCountry = null) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
else {
|
|
38
|
-
throw new Error(`Unsupported model: ${
|
|
38
|
+
throw new Error(`Unsupported model: ${model}`);
|
|
39
39
|
}
|
|
40
|
+
// Convert model identifier to column name (e.g., "google/ai-overview" -> "ai_overview")
|
|
41
|
+
const modelColumnName = cleanColumnName(model.split('/').pop() ?? model);
|
|
40
42
|
const responses = searchResults.map((sr, i) => ({
|
|
41
43
|
answer: sr.answer,
|
|
42
44
|
sources: sr.sources,
|
|
43
45
|
prompt: sr.prompt ?? (typeof prompts[i] === 'string' ? prompts[i] : ''),
|
|
44
|
-
model:
|
|
46
|
+
model: modelColumnName,
|
|
45
47
|
searchQueries: sr.searchQueries ?? [],
|
|
46
48
|
searchSources: sr.searchSources ?? []
|
|
47
49
|
}));
|
|
@@ -54,20 +56,51 @@ const intentLabels = {
|
|
|
54
56
|
};
|
|
55
57
|
export async function classifyIntent(texts) {
|
|
56
58
|
console.log('Classifying prompt intents...');
|
|
59
|
+
const classifier = new Classifier({
|
|
60
|
+
labels: intentLabels,
|
|
61
|
+
instructions: 'Classify the search query into one of the following intents: informational, navigational, transactional.'
|
|
62
|
+
}, { model: 'gpt-4.1-mini' });
|
|
57
63
|
const textRecords = texts.map(text => ({ text }));
|
|
58
|
-
const intents = await
|
|
59
|
-
return intents;
|
|
64
|
+
const intents = await classifier.batch(textRecords);
|
|
65
|
+
return intents.toArray();
|
|
66
|
+
}
|
|
67
|
+
export async function extractTopics(params) {
|
|
68
|
+
const extractor = new TopicExtractor({
|
|
69
|
+
maxSamples: params.maxSamples,
|
|
70
|
+
instructions: params.instructions,
|
|
71
|
+
language: params.language
|
|
72
|
+
}, { model: params.model ?? 'gpt-4.1-mini' });
|
|
73
|
+
const result = await extractor.invoke(params.records);
|
|
74
|
+
return result.parsed;
|
|
75
|
+
}
|
|
76
|
+
export async function generatePersonas(params) {
|
|
77
|
+
const generator = new PersonaGenerator({
|
|
78
|
+
sector: params.sector,
|
|
79
|
+
market: params.market,
|
|
80
|
+
language: params.language,
|
|
81
|
+
brand: params.brand,
|
|
82
|
+
brandDomain: params.brandDomain,
|
|
83
|
+
count: params.count,
|
|
84
|
+
briefing: params.briefing,
|
|
85
|
+
instructions: params.instructions,
|
|
86
|
+
userLanguage: params.userLanguage
|
|
87
|
+
}, { model: params.model ?? 'gpt-4.1' });
|
|
88
|
+
const result = await generator.invoke(params.personas ?? null);
|
|
89
|
+
return result.parsed;
|
|
60
90
|
}
|
|
61
91
|
export async function extractAndAssignTopics(texts) {
|
|
62
92
|
console.log('Identifying topics...');
|
|
63
93
|
const textRecords = texts.map(text => ({ text }));
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
94
|
+
const extractor = new TopicExtractor({ maxSamples: 500 }, { model: 'gpt-4.1' });
|
|
95
|
+
const taxonomyResult = await extractor.invoke(textRecords);
|
|
96
|
+
const taxonomy = taxonomyResult.parsed;
|
|
97
|
+
if (taxonomy == null) {
|
|
98
|
+
return texts.map(() => ({ topic: null, subtopic: null }));
|
|
99
|
+
}
|
|
68
100
|
console.log('Assigning topics...');
|
|
69
|
-
const
|
|
70
|
-
|
|
101
|
+
const assigner = new TopicAssigner({ taxonomy }, { model: 'gpt-4.1-mini' });
|
|
102
|
+
const topicLabels = await assigner.batch(texts);
|
|
103
|
+
return topicLabels.toArray().map(label => ({
|
|
71
104
|
topic: label?.topic ?? null,
|
|
72
105
|
subtopic: label?.subtopic ?? null
|
|
73
106
|
}));
|
|
@@ -75,8 +108,9 @@ export async function extractAndAssignTopics(texts) {
|
|
|
75
108
|
export async function assignFunnelStages(texts, funnel) {
|
|
76
109
|
console.log('Assigning funnel stages...');
|
|
77
110
|
const funnelTopics = funnelToTopics(funnel);
|
|
78
|
-
const
|
|
79
|
-
|
|
111
|
+
const assigner = new TopicAssigner({ taxonomy: funnelTopics }, { model: 'gpt-4.1-mini' });
|
|
112
|
+
const funnelLabels = await assigner.batch(texts);
|
|
113
|
+
return funnelLabels.toArray().map(label => ({
|
|
80
114
|
funnelStage: label?.topic ?? null,
|
|
81
115
|
funnelCategory: label?.subtopic ?? null
|
|
82
116
|
}));
|
|
@@ -87,9 +121,13 @@ export async function classifyIntoPersonas(texts, personas) {
|
|
|
87
121
|
personas.forEach(persona => {
|
|
88
122
|
personaLabels[persona.name] = persona.description;
|
|
89
123
|
});
|
|
124
|
+
const labeler = new Labeler({
|
|
125
|
+
labels: personaLabels,
|
|
126
|
+
instructions: 'Classify the search query into one or more customer personas based on the language, intent, and context.'
|
|
127
|
+
}, { model: 'gpt-4.1-mini' });
|
|
90
128
|
const textRecords = texts.map(text => ({ text }));
|
|
91
|
-
const personaAssignments = await
|
|
92
|
-
return personaAssignments;
|
|
129
|
+
const personaAssignments = await labeler.batch(textRecords);
|
|
130
|
+
return personaAssignments.toArray();
|
|
93
131
|
}
|
|
94
132
|
export async function classifyBrandedNonBranded(texts) {
|
|
95
133
|
console.log('Classifying prompts into branded/non-branded...');
|
|
@@ -97,18 +135,25 @@ export async function classifyBrandedNonBranded(texts) {
|
|
|
97
135
|
'branded': 'The query explicitly mentions a specific brand name, company name, product name, or trademark. It shows clear brand awareness and intent to find information about that particular brand.',
|
|
98
136
|
'non-branded': 'The query is generic and does not mention any specific brand names. It focuses on product categories, features, problems, or general information without brand specificity.'
|
|
99
137
|
};
|
|
138
|
+
const classifier = new Classifier({
|
|
139
|
+
labels: brandedLabels,
|
|
140
|
+
instructions: 'Classify whether the search query mentions specific brands or is generic/category-based.'
|
|
141
|
+
}, { model: 'gpt-4.1-mini' });
|
|
100
142
|
const textRecords = texts.map(text => ({ text }));
|
|
101
|
-
const brandedClassifications = await
|
|
102
|
-
return brandedClassifications;
|
|
143
|
+
const brandedClassifications = await classifier.batch(textRecords);
|
|
144
|
+
return brandedClassifications.toArray();
|
|
103
145
|
}
|
|
104
146
|
export async function extractEntities(texts) {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
147
|
+
const extractor = new EntityExtractor({
|
|
148
|
+
entityDefinitions: {
|
|
149
|
+
brands: 'Any brand or companies mentioned',
|
|
150
|
+
products: 'Any products or services mentioned',
|
|
151
|
+
features: 'Specific features or attributes of products/services',
|
|
152
|
+
issues: 'Problems or issues mentioned'
|
|
153
|
+
}
|
|
154
|
+
}, { model: 'gpt-4.1-mini' });
|
|
155
|
+
const result = await extractor.batch(texts);
|
|
156
|
+
return result.toArray();
|
|
112
157
|
}
|
|
113
158
|
export async function scorePurchaseProbability(texts, numDays = 30) {
|
|
114
159
|
console.log('Scoring purchase probability...');
|
|
@@ -118,8 +163,9 @@ export async function scorePurchaseProbability(texts, numDays = 30) {
|
|
|
118
163
|
in the next ${numDays} days. The input record is a text query representing a search
|
|
119
164
|
that a user may perform using a traditional search engine or LLM chat.
|
|
120
165
|
`);
|
|
121
|
-
const
|
|
122
|
-
|
|
166
|
+
const scorer = new Scorer({ name: 'Purchase Probability', description: description, type: 'integer', min: 0, max: 100 }, { model: 'gpt-4.1-mini' });
|
|
167
|
+
const scores = await scorer.batch(records);
|
|
168
|
+
return scores.toArray();
|
|
123
169
|
}
|
|
124
170
|
export async function scoreRelevance(prompts, context) {
|
|
125
171
|
console.log('Scoring prompt relevance...');
|
|
@@ -156,6 +202,7 @@ export async function scoreRelevance(prompts, context) {
|
|
|
156
202
|
1.0 means the keyword/prompt is highly relevant and specific to the context, e.g.
|
|
157
203
|
"best CRM software for small business" for a brand selling CRM software.
|
|
158
204
|
`);
|
|
159
|
-
const
|
|
160
|
-
|
|
205
|
+
const scorer = new Scorer({ name: 'Prompt Relevance', description: description, type: 'number', min: 0.0, max: 1.0 }, { model: 'gpt-4.1-mini' });
|
|
206
|
+
const scores = await scorer.batch(records);
|
|
207
|
+
return scores.toArray();
|
|
161
208
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 3. Download: GET /datasets/v3/snapshot/{snapshot_id}
|
|
9
9
|
*/
|
|
10
10
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
11
|
-
import { withRetries, sleep } from '../../async.js';
|
|
11
|
+
import { withRetries, sleep } from '../../helpers/async.js';
|
|
12
12
|
import { getAbortSignal, cleanAnswer, buildSources, buildSearchSources } from './scraper.js';
|
|
13
13
|
// ============================================================================
|
|
14
14
|
// Constants
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* 3. Download: GET /v1/queries/{id}/results
|
|
9
9
|
*/
|
|
10
10
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
11
|
-
import { withRetries, sleep } from '../../async.js';
|
|
11
|
+
import { withRetries, sleep } from '../../helpers/async.js';
|
|
12
12
|
import { getAbortSignal, cleanAnswer, buildSources } from './scraper.js';
|
|
13
13
|
// ============================================================================
|
|
14
14
|
// Constants
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Uses composition: providers supply functions, this module orchestrates them.
|
|
6
6
|
*/
|
|
7
7
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
8
|
-
import { mapParallel } from '../../async.js';
|
|
9
|
-
import { extractDomain } from '../../urls.js';
|
|
8
|
+
import { mapParallel } from '../../helpers/async.js';
|
|
9
|
+
import { extractDomain } from '../../helpers/urls.js';
|
|
10
10
|
// ============================================================================
|
|
11
11
|
// Shared Utilities
|
|
12
12
|
// ============================================================================
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint no-console: ["warn", { allow: ["log", "warn", "error"] }] */
|
|
2
|
-
import { mapParallel } from '../../async.js';
|
|
2
|
+
import { mapParallel } from '../../helpers/async.js';
|
|
3
3
|
import { fetchHasDataWithRetry, HASDATA_CONCURRENCY, parseAIM } from './helpers.js';
|
|
4
4
|
export async function fetchAIM(prompt, country = null, language = null, location = null) {
|
|
5
5
|
const aimEndpoint = 'https://api.hasdata.com/scrape/google/ai-mode';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint no-console: ["warn", { allow: ["log", "warn", "error"] }] */
|
|
2
|
-
import { mapParallel } from '../../async.js';
|
|
2
|
+
import { mapParallel } from '../../helpers/async.js';
|
|
3
3
|
import { fetchHasDataWithRetry, HASDATA_CONCURRENCY, parseAIO } from './helpers.js';
|
|
4
4
|
function aioRequestUrl(aio) {
|
|
5
5
|
if (aio.pageToken && aio.hasdataLink) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type RetryConfig } from '../../async.js';
|
|
1
|
+
import { type RetryConfig } from '../../helpers/async.js';
|
|
2
2
|
import type { Source } from '../../schemas/sources.schema.js';
|
|
3
3
|
export declare const HASDATA_CONCURRENCY = 29;
|
|
4
4
|
export declare const HASDATA_RETRY_CONFIG: RetryConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/apis/hasdata/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/apis/hasdata/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAG9D,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,eAAO,MAAM,oBAAoB,EAAE,WAMlC,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED,wBAAsB,qBAAqB,CAC1C,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,WAAkC,GAC7C,OAAO,CAAC,QAAQ,CAAC,CAgCnB;AAED,UAAU,QAAQ;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;CACvB;AAED,UAAU,SAAS;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uBAAuB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,gBAAgB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,eAAe;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,MAAM;IACtB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACvB;AAwJD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAInD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAI/C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
2
|
-
import { withRetries } from '../../async.js';
|
|
3
|
-
import { extractDomain } from '../../urls.js';
|
|
2
|
+
import { withRetries } from '../../helpers/async.js';
|
|
3
|
+
import { extractDomain } from '../../helpers/urls.js';
|
|
4
4
|
export const HASDATA_CONCURRENCY = 29;
|
|
5
5
|
export const HASDATA_RETRY_CONFIG = {
|
|
6
6
|
maxRetries: 3,
|