@graphext/cuery 0.7.0 → 0.9.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/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +1 -1
- package/esm/src/schemas/brand.schema.d.ts +7 -1
- package/esm/src/schemas/brand.schema.d.ts.map +1 -1
- package/esm/src/schemas/brand.schema.js +2 -0
- package/esm/src/tools/brands.d.ts +1 -1
- package/esm/src/tools/brands.d.ts.map +1 -1
- package/esm/src/tools/brands.js +47 -16
- package/package.json +1 -1
- package/script/mod.d.ts +1 -1
- package/script/mod.d.ts.map +1 -1
- package/script/mod.js +1 -1
- package/script/src/schemas/brand.schema.d.ts +7 -1
- package/script/src/schemas/brand.schema.d.ts.map +1 -1
- package/script/src/schemas/brand.schema.js +2 -0
- package/script/src/tools/brands.d.ts +1 -1
- package/script/src/tools/brands.d.ts.map +1 -1
- package/script/src/tools/brands.js +47 -16
- package/esm/src/api.d.ts +0 -73
- package/esm/src/api.d.ts.map +0 -1
- package/esm/src/api.js +0 -208
- package/esm/src/apis/hasdata/aim.d.ts +0 -4
- package/esm/src/apis/hasdata/aim.d.ts.map +0 -1
- package/esm/src/apis/hasdata/aim.js +0 -32
- package/esm/src/apis/hasdata/aio.d.ts +0 -4
- package/esm/src/apis/hasdata/aio.d.ts.map +0 -1
- package/esm/src/apis/hasdata/aio.js +0 -42
- package/esm/src/apis/hasdata/helpers.d.ts +0 -55
- package/esm/src/apis/hasdata/helpers.d.ts.map +0 -1
- package/esm/src/apis/hasdata/helpers.js +0 -182
- package/script/src/api.d.ts +0 -73
- package/script/src/api.d.ts.map +0 -1
- package/script/src/api.js +0 -221
- package/script/src/apis/hasdata/aim.d.ts +0 -4
- package/script/src/apis/hasdata/aim.d.ts.map +0 -1
- package/script/src/apis/hasdata/aim.js +0 -36
- package/script/src/apis/hasdata/aio.d.ts +0 -4
- package/script/src/apis/hasdata/aio.d.ts.map +0 -1
- package/script/src/apis/hasdata/aio.js +0 -46
- package/script/src/apis/hasdata/helpers.d.ts +0 -55
- package/script/src/apis/hasdata/helpers.d.ts.map +0 -1
- package/script/src/apis/hasdata/helpers.js +0 -222
package/esm/mod.d.ts
CHANGED
|
@@ -20,9 +20,9 @@ export * from './src/tools/summarize.js';
|
|
|
20
20
|
export * from './src/tools/sources.js';
|
|
21
21
|
export * from './src/tools/entities.js';
|
|
22
22
|
export * from './src/tools/prompts.js';
|
|
23
|
+
export * from './src/tools/scorer.js';
|
|
23
24
|
export * from './src/helpers/seedKeywords.js';
|
|
24
25
|
export * from './src/tools/generic.js';
|
|
25
|
-
export * from './src/api.js';
|
|
26
26
|
export * from './src/apis/chatgptScraper/index.js';
|
|
27
27
|
export * from './src/apis/googleAds/keywordPlanner.js';
|
|
28
28
|
export * from './src/schemas/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;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,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,
|
|
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,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
|
package/esm/mod.js
CHANGED
|
@@ -22,9 +22,9 @@ export * from './src/tools/summarize.js';
|
|
|
22
22
|
export * from './src/tools/sources.js';
|
|
23
23
|
export * from './src/tools/entities.js';
|
|
24
24
|
export * from './src/tools/prompts.js';
|
|
25
|
+
export * from './src/tools/scorer.js';
|
|
25
26
|
export * from './src/helpers/seedKeywords.js';
|
|
26
27
|
export * from './src/tools/generic.js';
|
|
27
|
-
export * from './src/api.js';
|
|
28
28
|
export * from './src/apis/chatgptScraper/index.js';
|
|
29
29
|
export * from './src/apis/googleAds/keywordPlanner.js';
|
|
30
30
|
export * from './src/schemas/index.js';
|
|
@@ -20,6 +20,7 @@ declare const ProductSchema: z.ZodObject<{
|
|
|
20
20
|
export declare const BrandSchema: z.ZodObject<{
|
|
21
21
|
name: z.ZodString;
|
|
22
22
|
shortName: z.ZodString;
|
|
23
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
23
24
|
description: z.ZodString;
|
|
24
25
|
domain: z.ZodString;
|
|
25
26
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -46,10 +47,13 @@ export type Product = z.infer<typeof ProductSchema> & {
|
|
|
46
47
|
/**
|
|
47
48
|
* TypeScript type inferred from BrandSchema.
|
|
48
49
|
* Extended to use the enriched Product type for portfolio.
|
|
50
|
+
* Keeps aliases optional at type-level for backward compatibility with
|
|
51
|
+
* legacy persisted Brand payloads that may not include this field.
|
|
49
52
|
* Safe to import in frontend with `import type`.
|
|
50
53
|
*/
|
|
51
|
-
export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio'> & {
|
|
54
|
+
export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio' | 'aliases'> & {
|
|
52
55
|
portfolio: Array<Product>;
|
|
56
|
+
aliases?: Array<string>;
|
|
53
57
|
};
|
|
54
58
|
/**
|
|
55
59
|
* Brand with additional context fields for pipeline processing.
|
|
@@ -73,6 +77,7 @@ declare const BrandListBaseSchema: z.ZodObject<{
|
|
|
73
77
|
brands: z.ZodArray<z.ZodObject<{
|
|
74
78
|
name: z.ZodString;
|
|
75
79
|
shortName: z.ZodString;
|
|
80
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
76
81
|
description: z.ZodString;
|
|
77
82
|
domain: z.ZodString;
|
|
78
83
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -98,6 +103,7 @@ export declare const BrandListSchema: z.ZodObject<{
|
|
|
98
103
|
brands: z.ZodArray<z.ZodObject<{
|
|
99
104
|
name: z.ZodString;
|
|
100
105
|
shortName: z.ZodString;
|
|
106
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
101
107
|
description: z.ZodString;
|
|
102
108
|
domain: z.ZodString;
|
|
103
109
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;GAMG;AAEH;;GAEG;AACH,QAAA,MAAM,aAAa;;;iBAG+C,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,8 @@ export const BrandSchema = z.object({
|
|
|
20
20
|
name: z.string().describe('Full name of the brand. E.g. "Tesla, Inc." or "Automobiles Peugeot".'),
|
|
21
21
|
shortName: z.string().describe('Short, common/canonical name of the brand, if different from the official name. ' +
|
|
22
22
|
'E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot".'),
|
|
23
|
+
aliases: z.array(z.string()).describe('Alternative names for the same brand (e.g., local variants, abbreviations, or common misspellings). ' +
|
|
24
|
+
'Always include this field; use [] when no reliable aliases are known.'),
|
|
23
25
|
description: z.string().describe('Description of the brand.'),
|
|
24
26
|
domain: z.string().min(1).describe('Official website of the brand.'),
|
|
25
27
|
sectors: z.array(z.string()).describe('List of main industrial sectors the brand operates in.'),
|
|
@@ -18,7 +18,7 @@ export declare function generatePortfolioKeywords(product: Product, sector: stri
|
|
|
18
18
|
* Generate seed keywords for all portfolio items in a brand concurrently,
|
|
19
19
|
* updating the keywordSeeds field in-place for each product.
|
|
20
20
|
*/
|
|
21
|
-
export declare function enrichBrandPortfolioWithKeywords(brand:
|
|
21
|
+
export declare function enrichBrandPortfolioWithKeywords<T extends Brand>(brand: T, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<T>;
|
|
22
22
|
export declare function generateCompetitorsInfo({ brand, brandDomain, sector, market, briefing, strict, instructions, brands, language, userLanguage, model, useSearch, countryISOCode, contextSize, reasoningEffort }: CompetitorSearchOptions): Promise<BrandListResponse>;
|
|
23
23
|
export declare function generateBrandInfo({ brand, brandDomain, language, userLanguage, sector, market, briefing, model, useSearch, countryISOCode, contextSize, reasoningEffort }: BrandSearchOptions): Promise<Brand>;
|
|
24
24
|
export declare function concatBrands(ownBrands: Array<Brand>, competitors: Array<Brand>): Array<FlaggedBrand>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EAAgC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,mBAAmB,GAAG,MAAM,CAuB9B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EAAgC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,mBAAmB,GAAG,MAAM,CAuB9B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAoIpC;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,GACvB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAaxB;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,KAAK,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,EACzB,cAAc,GAAE,MAAY,EAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAGD,wBAAsB,uBAAuB,CAAC,EAC7C,KAAK,EACL,WAAW,EACX,MAAa,EACb,MAAa,EACb,QAAQ,EACR,MAAa,EACb,YAAiB,EACjB,MAAa,EACb,QAAe,EACf,YAAmB,EACnB,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDtD;AAED,wBAAsB,iBAAiB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,QAAe,EACf,YAAmB,EACnB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CA2CrC;AAED,wBAAgB,YAAY,CAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EACvB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GACvB,KAAK,CAAC,YAAY,CAAC,CAYrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBvD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI7D;AAuED;;;GAGG;AAQH;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GACtB,KAAK,CAAC,MAAM,CAAC,CA6Gf;AAED,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EACpB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/B;AAED,mBAAmB,4BAA4B,CAAC"}
|
package/esm/src/tools/brands.js
CHANGED
|
@@ -77,6 +77,8 @@ should have the following fields:
|
|
|
77
77
|
- shortName: A short, common/canonical name of the competitor brand, if different from the official name.
|
|
78
78
|
E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
|
|
79
79
|
set same as name.
|
|
80
|
+
- aliases: Array of alternative names for the competitor brand (e.g., local variants, abbreviations,
|
|
81
|
+
common misspellings, legacy names). Always include this field; if no reliable aliases are known, use [].
|
|
80
82
|
- description: A brief description of the competitor brand's main activity.
|
|
81
83
|
- domain: The official website of the competitor brand, if available.
|
|
82
84
|
- sectors: A list of main industrial sectors the competitor brand operates in.
|
|
@@ -91,6 +93,7 @@ It's more important to be comprehensive than selective, so include more competit
|
|
|
91
93
|
Try to order them by relevance, with the most direct and bigger competitors first.
|
|
92
94
|
|
|
93
95
|
Return the answer (field values) in the language "{language}".
|
|
96
|
+
Always include "aliases" for every brand object, even if it is an empty array.
|
|
94
97
|
|
|
95
98
|
Also provide an "explanation" field with a brief summary (2-3 sentences) explaining the reasoning behind
|
|
96
99
|
the competitors you identified: what makes them relevant competitors, how they relate to the original brand,
|
|
@@ -126,6 +129,8 @@ Find out the following information about this brand:
|
|
|
126
129
|
- shortName: A short, common/canonical name of the brand, if different from the official name.
|
|
127
130
|
E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
|
|
128
131
|
set same as name.
|
|
132
|
+
- aliases: Array of alternative names for the same brand (local variants, abbreviations, common misspellings,
|
|
133
|
+
or legacy names). Always include this field; if no reliable aliases are known, use [].
|
|
129
134
|
- description: A brief description of the brand's main activity.
|
|
130
135
|
- domain: The official website of the brand, if available.
|
|
131
136
|
- sectors: A list of specific industrial sectors the brand operates in, ordered by relevance. Be precise and concrete rather than generic - for example, instead of "education", use "professional training for unemployed", "corporate learning and development", or "online coding bootcamps". Adapt the specificity level to match the brand's actual focus and niche.
|
|
@@ -137,7 +142,16 @@ Find out the following information about this brand:
|
|
|
137
142
|
- favicon: URL of the brand's favicon, if available.
|
|
138
143
|
|
|
139
144
|
Return the answer as a JSON object with field values in the language "{language}".
|
|
145
|
+
Always include "aliases", even when empty.
|
|
140
146
|
`);
|
|
147
|
+
function ensureBrandAliases(brand) {
|
|
148
|
+
return {
|
|
149
|
+
...brand,
|
|
150
|
+
aliases: Array.isArray(brand.aliases)
|
|
151
|
+
? brand.aliases
|
|
152
|
+
: []
|
|
153
|
+
};
|
|
154
|
+
}
|
|
141
155
|
/**
|
|
142
156
|
* Generate seed keywords for a single portfolio item using an LLM.
|
|
143
157
|
*/
|
|
@@ -199,10 +213,12 @@ export async function generateCompetitorsInfo({ brand, brandDomain, sector = nul
|
|
|
199
213
|
reasoningEffort
|
|
200
214
|
});
|
|
201
215
|
// Make sure these are clean domains
|
|
202
|
-
response.brands.map(brand => {
|
|
216
|
+
response.brands = response.brands.map((brand) => {
|
|
217
|
+
const normalizedBrand = ensureBrandAliases(brand);
|
|
203
218
|
if (brand.domain) {
|
|
204
|
-
|
|
219
|
+
normalizedBrand.domain = extractDomain(brand.domain);
|
|
205
220
|
}
|
|
221
|
+
return normalizedBrand;
|
|
206
222
|
});
|
|
207
223
|
const enrichedBrands = await mapParallel(response.brands, 100, async (brand) => enrichBrandPortfolioWithKeywords(brand, language, model, undefined, sector, market));
|
|
208
224
|
return {
|
|
@@ -233,18 +249,19 @@ export async function generateBrandInfo({ brand, brandDomain, language = 'en', u
|
|
|
233
249
|
reasoningEffort: reasoningEffort,
|
|
234
250
|
useSearch
|
|
235
251
|
});
|
|
252
|
+
const normalizedBrandInfo = ensureBrandAliases(brandInfo);
|
|
236
253
|
// Make sure this is a clean domain
|
|
237
|
-
|
|
238
|
-
const enrichedBrand = await enrichBrandPortfolioWithKeywords(
|
|
254
|
+
normalizedBrandInfo.domain = extractDomain(normalizedBrandInfo.domain);
|
|
255
|
+
const enrichedBrand = await enrichBrandPortfolioWithKeywords(normalizedBrandInfo, language, model, undefined, sector, market);
|
|
239
256
|
return enrichedBrand;
|
|
240
257
|
}
|
|
241
258
|
export function concatBrands(ownBrands, competitors) {
|
|
242
259
|
const ownBrandsWithFlag = ownBrands.map((brand) => ({
|
|
243
|
-
...brand,
|
|
260
|
+
...ensureBrandAliases(brand),
|
|
244
261
|
isCompetitor: false
|
|
245
262
|
}));
|
|
246
263
|
const competitorsWithFlag = competitors.map((brand) => ({
|
|
247
|
-
...brand,
|
|
264
|
+
...ensureBrandAliases(brand),
|
|
248
265
|
isCompetitor: true
|
|
249
266
|
}));
|
|
250
267
|
return [...ownBrandsWithFlag, ...competitorsWithFlag];
|
|
@@ -377,11 +394,16 @@ export function rankBrandsInText(text, brands, entities) {
|
|
|
377
394
|
// Create a normalized version of text for pattern matching (expands CamelCase, etc.)
|
|
378
395
|
const normalizedText = normalizeTextForMatching(text);
|
|
379
396
|
const brandEntities = entities?.filter(entity => entity.type.toLowerCase() === 'brand') ?? [];
|
|
380
|
-
// Build a map from ultra-normalized
|
|
381
|
-
// Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co"
|
|
397
|
+
// Build a map from ultra-normalized brand token to the entity text variation (if any)
|
|
398
|
+
// Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co".
|
|
399
|
+
// This map is used for shortName and aliases alike.
|
|
382
400
|
const entityTextByNormalizedBrand = new Map();
|
|
383
401
|
for (const entity of brandEntities) {
|
|
384
|
-
|
|
402
|
+
const key = createBrandMatchKey(entity.name);
|
|
403
|
+
if (!key || entityTextByNormalizedBrand.has(key)) {
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
entityTextByNormalizedBrand.set(key, entity.name);
|
|
385
407
|
}
|
|
386
408
|
// Set of ultra-normalized entity names that match a FlaggedBrand (to exclude from separate processing)
|
|
387
409
|
const matchedEntityNames = new Set();
|
|
@@ -400,10 +422,19 @@ export function rankBrandsInText(text, brands, entities) {
|
|
|
400
422
|
// Process FlaggedBrands, using entity text as an additional search variant when available
|
|
401
423
|
for (const brand of brands) {
|
|
402
424
|
let earliestPosition = Infinity;
|
|
403
|
-
const
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
425
|
+
const brandNameVariants = [
|
|
426
|
+
brand.shortName,
|
|
427
|
+
...(Array.isArray(brand.aliases) ? brand.aliases : [])
|
|
428
|
+
].filter((value) => value != null && value.trim() !== '');
|
|
429
|
+
const normalizedBrandVariants = new Set(brandNameVariants
|
|
430
|
+
.map((value) => createBrandMatchKey(value))
|
|
431
|
+
.filter((value) => value.length > 0));
|
|
432
|
+
// Check if there's a matching entity for this brand (shortName or alias key match)
|
|
433
|
+
for (const normalizedVariant of normalizedBrandVariants) {
|
|
434
|
+
const entityText = entityTextByNormalizedBrand.get(normalizedVariant);
|
|
435
|
+
if (entityText == null) {
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
407
438
|
matchedEntityNames.add(createBrandMatchKey(entityText));
|
|
408
439
|
// Use flexible pattern matching to find the entity in text (handles CamelCase, &/and, etc.)
|
|
409
440
|
const entityPattern = createBrandMatchPattern(entityText);
|
|
@@ -412,9 +443,9 @@ export function rankBrandsInText(text, brands, entities) {
|
|
|
412
443
|
earliestPosition = Math.min(earliestPosition, position);
|
|
413
444
|
}
|
|
414
445
|
}
|
|
415
|
-
// Check
|
|
416
|
-
|
|
417
|
-
const brandPattern = createBrandMatchPattern(
|
|
446
|
+
// Check shortName + aliases using flexible pattern matching
|
|
447
|
+
for (const brandNameVariant of brandNameVariants) {
|
|
448
|
+
const brandPattern = createBrandMatchPattern(brandNameVariant);
|
|
418
449
|
const position = findPatternPosition(brandPattern);
|
|
419
450
|
if (position !== -1) {
|
|
420
451
|
earliestPosition = Math.min(earliestPosition, position);
|
package/package.json
CHANGED
package/script/mod.d.ts
CHANGED
|
@@ -20,9 +20,9 @@ export * from './src/tools/summarize.js';
|
|
|
20
20
|
export * from './src/tools/sources.js';
|
|
21
21
|
export * from './src/tools/entities.js';
|
|
22
22
|
export * from './src/tools/prompts.js';
|
|
23
|
+
export * from './src/tools/scorer.js';
|
|
23
24
|
export * from './src/helpers/seedKeywords.js';
|
|
24
25
|
export * from './src/tools/generic.js';
|
|
25
|
-
export * from './src/api.js';
|
|
26
26
|
export * from './src/apis/chatgptScraper/index.js';
|
|
27
27
|
export * from './src/apis/googleAds/keywordPlanner.js';
|
|
28
28
|
export * from './src/schemas/index.js';
|
package/script/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,
|
|
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,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
|
package/script/mod.js
CHANGED
|
@@ -45,9 +45,9 @@ __exportStar(require("./src/tools/summarize.js"), exports);
|
|
|
45
45
|
__exportStar(require("./src/tools/sources.js"), exports);
|
|
46
46
|
__exportStar(require("./src/tools/entities.js"), exports);
|
|
47
47
|
__exportStar(require("./src/tools/prompts.js"), exports);
|
|
48
|
+
__exportStar(require("./src/tools/scorer.js"), exports);
|
|
48
49
|
__exportStar(require("./src/helpers/seedKeywords.js"), exports);
|
|
49
50
|
__exportStar(require("./src/tools/generic.js"), exports);
|
|
50
|
-
__exportStar(require("./src/api.js"), exports);
|
|
51
51
|
__exportStar(require("./src/apis/chatgptScraper/index.js"), exports);
|
|
52
52
|
__exportStar(require("./src/apis/googleAds/keywordPlanner.js"), exports);
|
|
53
53
|
__exportStar(require("./src/schemas/index.js"), exports);
|
|
@@ -20,6 +20,7 @@ declare const ProductSchema: z.ZodObject<{
|
|
|
20
20
|
export declare const BrandSchema: z.ZodObject<{
|
|
21
21
|
name: z.ZodString;
|
|
22
22
|
shortName: z.ZodString;
|
|
23
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
23
24
|
description: z.ZodString;
|
|
24
25
|
domain: z.ZodString;
|
|
25
26
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -46,10 +47,13 @@ export type Product = z.infer<typeof ProductSchema> & {
|
|
|
46
47
|
/**
|
|
47
48
|
* TypeScript type inferred from BrandSchema.
|
|
48
49
|
* Extended to use the enriched Product type for portfolio.
|
|
50
|
+
* Keeps aliases optional at type-level for backward compatibility with
|
|
51
|
+
* legacy persisted Brand payloads that may not include this field.
|
|
49
52
|
* Safe to import in frontend with `import type`.
|
|
50
53
|
*/
|
|
51
|
-
export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio'> & {
|
|
54
|
+
export type Brand = Omit<z.infer<typeof BrandSchema>, 'portfolio' | 'aliases'> & {
|
|
52
55
|
portfolio: Array<Product>;
|
|
56
|
+
aliases?: Array<string>;
|
|
53
57
|
};
|
|
54
58
|
/**
|
|
55
59
|
* Brand with additional context fields for pipeline processing.
|
|
@@ -73,6 +77,7 @@ declare const BrandListBaseSchema: z.ZodObject<{
|
|
|
73
77
|
brands: z.ZodArray<z.ZodObject<{
|
|
74
78
|
name: z.ZodString;
|
|
75
79
|
shortName: z.ZodString;
|
|
80
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
76
81
|
description: z.ZodString;
|
|
77
82
|
domain: z.ZodString;
|
|
78
83
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -98,6 +103,7 @@ export declare const BrandListSchema: z.ZodObject<{
|
|
|
98
103
|
brands: z.ZodArray<z.ZodObject<{
|
|
99
104
|
name: z.ZodString;
|
|
100
105
|
shortName: z.ZodString;
|
|
106
|
+
aliases: z.ZodArray<z.ZodString>;
|
|
101
107
|
description: z.ZodString;
|
|
102
108
|
domain: z.ZodString;
|
|
103
109
|
sectors: z.ZodArray<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;GAMG;AAEH;;GAEG;AACH,QAAA,MAAM,aAAa;;;iBAG+C,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"brand.schema.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/brand.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,8 @@ exports.BrandSchema = index_js_1.z.object({
|
|
|
23
23
|
name: index_js_1.z.string().describe('Full name of the brand. E.g. "Tesla, Inc." or "Automobiles Peugeot".'),
|
|
24
24
|
shortName: index_js_1.z.string().describe('Short, common/canonical name of the brand, if different from the official name. ' +
|
|
25
25
|
'E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot".'),
|
|
26
|
+
aliases: index_js_1.z.array(index_js_1.z.string()).describe('Alternative names for the same brand (e.g., local variants, abbreviations, or common misspellings). ' +
|
|
27
|
+
'Always include this field; use [] when no reliable aliases are known.'),
|
|
26
28
|
description: index_js_1.z.string().describe('Description of the brand.'),
|
|
27
29
|
domain: index_js_1.z.string().min(1).describe('Official website of the brand.'),
|
|
28
30
|
sectors: index_js_1.z.array(index_js_1.z.string()).describe('List of main industrial sectors the brand operates in.'),
|
|
@@ -18,7 +18,7 @@ export declare function generatePortfolioKeywords(product: Product, sector: stri
|
|
|
18
18
|
* Generate seed keywords for all portfolio items in a brand concurrently,
|
|
19
19
|
* updating the keywordSeeds field in-place for each product.
|
|
20
20
|
*/
|
|
21
|
-
export declare function enrichBrandPortfolioWithKeywords(brand:
|
|
21
|
+
export declare function enrichBrandPortfolioWithKeywords<T extends Brand>(brand: T, language?: string, model?: string, maxConcurrency?: number, sector?: string | null, market?: string | null): Promise<T>;
|
|
22
22
|
export declare function generateCompetitorsInfo({ brand, brandDomain, sector, market, briefing, strict, instructions, brands, language, userLanguage, model, useSearch, countryISOCode, contextSize, reasoningEffort }: CompetitorSearchOptions): Promise<BrandListResponse>;
|
|
23
23
|
export declare function generateBrandInfo({ brand, brandDomain, language, userLanguage, sector, market, briefing, model, useSearch, countryISOCode, contextSize, reasoningEffort }: BrandSearchOptions): Promise<Brand>;
|
|
24
24
|
export declare function concatBrands(ownBrands: Array<Brand>, competitors: Array<Brand>): Array<FlaggedBrand>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EAAgC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,mBAAmB,GAAG,MAAM,CAuB9B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../../src/src/tools/brands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjH,OAAO,EAAgC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAIvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,UAAU,mBAAmB;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,iBAAiB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,mBAAmB,GAAG,MAAM,CAuB9B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAoIpC;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,GACvB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAaxB;AAED;;;GAGG;AACH,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,KAAK,EACrE,KAAK,EAAE,CAAC,EACR,QAAQ,GAAE,MAAa,EACvB,KAAK,GAAE,MAAkB,EACzB,cAAc,GAAE,MAAY,EAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAGD,wBAAsB,uBAAuB,CAAC,EAC7C,KAAK,EACL,WAAW,EACX,MAAa,EACb,MAAa,EACb,QAAQ,EACR,MAAa,EACb,YAAiB,EACjB,MAAa,EACb,QAAe,EACf,YAAmB,EACnB,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDtD;AAED,wBAAsB,iBAAiB,CAAC,EACvC,KAAK,EACL,WAAW,EACX,QAAe,EACf,YAAmB,EACnB,MAAM,EACN,MAAM,EACN,QAAQ,EACR,KAA4B,EAC5B,SAAgB,EAChB,cAAqB,EACrB,WAAsB,EACtB,eAAuB,EACvB,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,CA2CrC;AAED,wBAAgB,YAAY,CAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EACvB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GACvB,KAAK,CAAC,YAAY,CAAC,CAYrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBvD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI7D;AAuED;;;GAGG;AAQH;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GACtB,KAAK,CAAC,MAAM,CAAC,CA6Gf;AAED,wBAAsB,iBAAiB,CACtC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EACpB,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAC3B,QAAQ,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAE/B;AAED,mBAAmB,4BAA4B,CAAC"}
|
|
@@ -89,6 +89,8 @@ should have the following fields:
|
|
|
89
89
|
- shortName: A short, common/canonical name of the competitor brand, if different from the official name.
|
|
90
90
|
E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
|
|
91
91
|
set same as name.
|
|
92
|
+
- aliases: Array of alternative names for the competitor brand (e.g., local variants, abbreviations,
|
|
93
|
+
common misspellings, legacy names). Always include this field; if no reliable aliases are known, use [].
|
|
92
94
|
- description: A brief description of the competitor brand's main activity.
|
|
93
95
|
- domain: The official website of the competitor brand, if available.
|
|
94
96
|
- sectors: A list of main industrial sectors the competitor brand operates in.
|
|
@@ -103,6 +105,7 @@ It's more important to be comprehensive than selective, so include more competit
|
|
|
103
105
|
Try to order them by relevance, with the most direct and bigger competitors first.
|
|
104
106
|
|
|
105
107
|
Return the answer (field values) in the language "{language}".
|
|
108
|
+
Always include "aliases" for every brand object, even if it is an empty array.
|
|
106
109
|
|
|
107
110
|
Also provide an "explanation" field with a brief summary (2-3 sentences) explaining the reasoning behind
|
|
108
111
|
the competitors you identified: what makes them relevant competitors, how they relate to the original brand,
|
|
@@ -138,6 +141,8 @@ Find out the following information about this brand:
|
|
|
138
141
|
- shortName: A short, common/canonical name of the brand, if different from the official name.
|
|
139
142
|
E.g. "Tesla" instead of "Tesla, Inc.", or "Peugeot" instead of "Automobiles Peugeot". If not applicable,
|
|
140
143
|
set same as name.
|
|
144
|
+
- aliases: Array of alternative names for the same brand (local variants, abbreviations, common misspellings,
|
|
145
|
+
or legacy names). Always include this field; if no reliable aliases are known, use [].
|
|
141
146
|
- description: A brief description of the brand's main activity.
|
|
142
147
|
- domain: The official website of the brand, if available.
|
|
143
148
|
- sectors: A list of specific industrial sectors the brand operates in, ordered by relevance. Be precise and concrete rather than generic - for example, instead of "education", use "professional training for unemployed", "corporate learning and development", or "online coding bootcamps". Adapt the specificity level to match the brand's actual focus and niche.
|
|
@@ -149,7 +154,16 @@ Find out the following information about this brand:
|
|
|
149
154
|
- favicon: URL of the brand's favicon, if available.
|
|
150
155
|
|
|
151
156
|
Return the answer as a JSON object with field values in the language "{language}".
|
|
157
|
+
Always include "aliases", even when empty.
|
|
152
158
|
`);
|
|
159
|
+
function ensureBrandAliases(brand) {
|
|
160
|
+
return {
|
|
161
|
+
...brand,
|
|
162
|
+
aliases: Array.isArray(brand.aliases)
|
|
163
|
+
? brand.aliases
|
|
164
|
+
: []
|
|
165
|
+
};
|
|
166
|
+
}
|
|
153
167
|
/**
|
|
154
168
|
* Generate seed keywords for a single portfolio item using an LLM.
|
|
155
169
|
*/
|
|
@@ -211,10 +225,12 @@ async function generateCompetitorsInfo({ brand, brandDomain, sector = null, mark
|
|
|
211
225
|
reasoningEffort
|
|
212
226
|
});
|
|
213
227
|
// Make sure these are clean domains
|
|
214
|
-
response.brands.map(brand => {
|
|
228
|
+
response.brands = response.brands.map((brand) => {
|
|
229
|
+
const normalizedBrand = ensureBrandAliases(brand);
|
|
215
230
|
if (brand.domain) {
|
|
216
|
-
|
|
231
|
+
normalizedBrand.domain = (0, urls_js_1.extractDomain)(brand.domain);
|
|
217
232
|
}
|
|
233
|
+
return normalizedBrand;
|
|
218
234
|
});
|
|
219
235
|
const enrichedBrands = await (0, async_js_1.mapParallel)(response.brands, 100, async (brand) => enrichBrandPortfolioWithKeywords(brand, language, model, undefined, sector, market));
|
|
220
236
|
return {
|
|
@@ -245,18 +261,19 @@ async function generateBrandInfo({ brand, brandDomain, language = 'en', userLang
|
|
|
245
261
|
reasoningEffort: reasoningEffort,
|
|
246
262
|
useSearch
|
|
247
263
|
});
|
|
264
|
+
const normalizedBrandInfo = ensureBrandAliases(brandInfo);
|
|
248
265
|
// Make sure this is a clean domain
|
|
249
|
-
|
|
250
|
-
const enrichedBrand = await enrichBrandPortfolioWithKeywords(
|
|
266
|
+
normalizedBrandInfo.domain = (0, urls_js_1.extractDomain)(normalizedBrandInfo.domain);
|
|
267
|
+
const enrichedBrand = await enrichBrandPortfolioWithKeywords(normalizedBrandInfo, language, model, undefined, sector, market);
|
|
251
268
|
return enrichedBrand;
|
|
252
269
|
}
|
|
253
270
|
function concatBrands(ownBrands, competitors) {
|
|
254
271
|
const ownBrandsWithFlag = ownBrands.map((brand) => ({
|
|
255
|
-
...brand,
|
|
272
|
+
...ensureBrandAliases(brand),
|
|
256
273
|
isCompetitor: false
|
|
257
274
|
}));
|
|
258
275
|
const competitorsWithFlag = competitors.map((brand) => ({
|
|
259
|
-
...brand,
|
|
276
|
+
...ensureBrandAliases(brand),
|
|
260
277
|
isCompetitor: true
|
|
261
278
|
}));
|
|
262
279
|
return [...ownBrandsWithFlag, ...competitorsWithFlag];
|
|
@@ -389,11 +406,16 @@ function rankBrandsInText(text, brands, entities) {
|
|
|
389
406
|
// Create a normalized version of text for pattern matching (expands CamelCase, etc.)
|
|
390
407
|
const normalizedText = normalizeTextForMatching(text);
|
|
391
408
|
const brandEntities = entities?.filter(entity => entity.type.toLowerCase() === 'brand') ?? [];
|
|
392
|
-
// Build a map from ultra-normalized
|
|
393
|
-
// Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co"
|
|
409
|
+
// Build a map from ultra-normalized brand token to the entity text variation (if any)
|
|
410
|
+
// Using createBrandMatchKey to handle cases like "acmeco" matching "Acme&Co".
|
|
411
|
+
// This map is used for shortName and aliases alike.
|
|
394
412
|
const entityTextByNormalizedBrand = new Map();
|
|
395
413
|
for (const entity of brandEntities) {
|
|
396
|
-
|
|
414
|
+
const key = createBrandMatchKey(entity.name);
|
|
415
|
+
if (!key || entityTextByNormalizedBrand.has(key)) {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
entityTextByNormalizedBrand.set(key, entity.name);
|
|
397
419
|
}
|
|
398
420
|
// Set of ultra-normalized entity names that match a FlaggedBrand (to exclude from separate processing)
|
|
399
421
|
const matchedEntityNames = new Set();
|
|
@@ -412,10 +434,19 @@ function rankBrandsInText(text, brands, entities) {
|
|
|
412
434
|
// Process FlaggedBrands, using entity text as an additional search variant when available
|
|
413
435
|
for (const brand of brands) {
|
|
414
436
|
let earliestPosition = Infinity;
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
437
|
+
const brandNameVariants = [
|
|
438
|
+
brand.shortName,
|
|
439
|
+
...(Array.isArray(brand.aliases) ? brand.aliases : [])
|
|
440
|
+
].filter((value) => value != null && value.trim() !== '');
|
|
441
|
+
const normalizedBrandVariants = new Set(brandNameVariants
|
|
442
|
+
.map((value) => createBrandMatchKey(value))
|
|
443
|
+
.filter((value) => value.length > 0));
|
|
444
|
+
// Check if there's a matching entity for this brand (shortName or alias key match)
|
|
445
|
+
for (const normalizedVariant of normalizedBrandVariants) {
|
|
446
|
+
const entityText = entityTextByNormalizedBrand.get(normalizedVariant);
|
|
447
|
+
if (entityText == null) {
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
419
450
|
matchedEntityNames.add(createBrandMatchKey(entityText));
|
|
420
451
|
// Use flexible pattern matching to find the entity in text (handles CamelCase, &/and, etc.)
|
|
421
452
|
const entityPattern = createBrandMatchPattern(entityText);
|
|
@@ -424,9 +455,9 @@ function rankBrandsInText(text, brands, entities) {
|
|
|
424
455
|
earliestPosition = Math.min(earliestPosition, position);
|
|
425
456
|
}
|
|
426
457
|
}
|
|
427
|
-
// Check
|
|
428
|
-
|
|
429
|
-
const brandPattern = createBrandMatchPattern(
|
|
458
|
+
// Check shortName + aliases using flexible pattern matching
|
|
459
|
+
for (const brandNameVariant of brandNameVariants) {
|
|
460
|
+
const brandPattern = createBrandMatchPattern(brandNameVariant);
|
|
430
461
|
const position = findPatternPosition(brandPattern);
|
|
431
462
|
if (position !== -1) {
|
|
432
463
|
earliestPosition = Math.min(earliestPosition, position);
|
package/esm/src/api.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { type JobId } from './apis/chatgptScraper/index.js';
|
|
2
|
-
import { type Entity } from './schemas/entity.schema.js';
|
|
3
|
-
import { type Funnel } from './schemas/funnel.schema.js';
|
|
4
|
-
import type { ModelIdentifier } from './schemas/models.schema.js';
|
|
5
|
-
import { type Persona } from './schemas/persona.schema.js';
|
|
6
|
-
import { type BrandContext } from './schemas/brand.schema.js';
|
|
7
|
-
import { type Source, type EnrichedSource, type SearchSource } from './schemas/sources.schema.js';
|
|
8
|
-
export type ModelResponse = {
|
|
9
|
-
prompt: string;
|
|
10
|
-
model: string;
|
|
11
|
-
answer: string;
|
|
12
|
-
sources: Array<Source>;
|
|
13
|
-
searchQueries: Array<string>;
|
|
14
|
-
searchSources: Array<SearchSource>;
|
|
15
|
-
};
|
|
16
|
-
export type EnrichedModelResponse = {
|
|
17
|
-
prompt: string;
|
|
18
|
-
model: string;
|
|
19
|
-
answer: string;
|
|
20
|
-
sources: Array<EnrichedSource>;
|
|
21
|
-
fanout?: Array<string>;
|
|
22
|
-
rankedBrandsInAnswer: Array<string>;
|
|
23
|
-
rankedBrandsInSourceTitles: Array<string>;
|
|
24
|
-
rankedBrandsInSourceDomains: Array<string>;
|
|
25
|
-
};
|
|
26
|
-
export declare function queryModel(prompts: Array<string | JobId>, model: ModelIdentifier, searchCountry?: string | null): Promise<Array<ModelResponse>>;
|
|
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>;
|
|
60
|
-
export declare function extractAndAssignTopics(texts: Array<string>): Promise<Array<{
|
|
61
|
-
topic: string | null;
|
|
62
|
-
subtopic: string | null;
|
|
63
|
-
}>>;
|
|
64
|
-
export declare function assignFunnelStages(texts: Array<string>, funnel: Funnel): Promise<Array<{
|
|
65
|
-
funnelStage: string | null;
|
|
66
|
-
funnelCategory: string | null;
|
|
67
|
-
}>>;
|
|
68
|
-
export declare function classifyIntoPersonas(texts: Array<string>, personas: Array<Persona>): Promise<Array<Array<string> | null>>;
|
|
69
|
-
export declare function classifyBrandedNonBranded(texts: Array<string>): Promise<Array<string | null>>;
|
|
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>>;
|
|
73
|
-
//# sourceMappingURL=api.d.ts.map
|
package/esm/src/api.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/src/api.ts"],"names":[],"mappings":"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"}
|