@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.
Files changed (203) hide show
  1. package/esm/browser.d.ts +1 -1
  2. package/esm/browser.d.ts.map +1 -1
  3. package/esm/browser.js +1 -1
  4. package/esm/mod.d.ts +5 -2
  5. package/esm/mod.d.ts.map +1 -1
  6. package/esm/mod.js +7 -2
  7. package/esm/src/api.d.ts +36 -5
  8. package/esm/src/api.d.ts.map +1 -1
  9. package/esm/src/api.js +84 -37
  10. package/esm/src/apis/chatgptScraper/brightdata.js +1 -1
  11. package/esm/src/apis/chatgptScraper/oxy.js +1 -1
  12. package/esm/src/apis/chatgptScraper/scraper.js +2 -2
  13. package/esm/src/apis/hasdata/aim.js +1 -1
  14. package/esm/src/apis/hasdata/aio.js +1 -1
  15. package/esm/src/apis/hasdata/helpers.d.ts +1 -1
  16. package/esm/src/apis/hasdata/helpers.d.ts.map +1 -1
  17. package/esm/src/apis/hasdata/helpers.js +2 -2
  18. package/esm/src/assets/models.d.ts +60725 -0
  19. package/esm/src/assets/models.d.ts.map +1 -0
  20. package/esm/src/assets/models.js +71915 -0
  21. package/esm/src/helpers/async.d.ts.map +1 -0
  22. package/esm/src/{async.js → helpers/async.js} +1 -1
  23. package/esm/src/helpers/seedKeywords.d.ts.map +1 -0
  24. package/esm/src/helpers/urls.d.ts.map +1 -0
  25. package/esm/src/helpers/utils.d.ts.map +1 -0
  26. package/esm/src/llm.d.ts +35 -0
  27. package/esm/src/llm.d.ts.map +1 -0
  28. package/esm/src/llm.js +59 -0
  29. package/esm/src/providers/google.d.ts +12 -0
  30. package/esm/src/providers/google.d.ts.map +1 -0
  31. package/esm/src/providers/google.js +111 -0
  32. package/esm/src/providers/index.d.ts +13 -0
  33. package/esm/src/providers/index.d.ts.map +1 -0
  34. package/esm/src/providers/index.js +14 -0
  35. package/esm/src/providers/openai.d.ts +12 -0
  36. package/esm/src/providers/openai.d.ts.map +1 -0
  37. package/esm/src/providers/openai.js +141 -0
  38. package/esm/src/providers/pricing.d.ts +72 -0
  39. package/esm/src/providers/pricing.d.ts.map +1 -0
  40. package/esm/src/providers/pricing.js +88 -0
  41. package/esm/src/providers/registry.d.ts +20 -0
  42. package/esm/src/providers/registry.d.ts.map +1 -0
  43. package/esm/src/providers/registry.js +35 -0
  44. package/esm/src/providers/types.d.ts +49 -0
  45. package/esm/src/providers/types.d.ts.map +1 -0
  46. package/esm/src/providers/types.js +7 -0
  47. package/esm/src/response.d.ts +74 -0
  48. package/esm/src/response.d.ts.map +1 -0
  49. package/esm/src/response.js +110 -0
  50. package/esm/src/tool.d.ts +58 -0
  51. package/esm/src/tool.d.ts.map +1 -0
  52. package/esm/src/tool.js +91 -0
  53. package/esm/src/tools/brands.js +6 -6
  54. package/esm/src/tools/classifier.d.ts +80 -17
  55. package/esm/src/tools/classifier.d.ts.map +1 -1
  56. package/esm/src/tools/classifier.js +68 -80
  57. package/esm/src/tools/entities.d.ts +23 -12
  58. package/esm/src/tools/entities.d.ts.map +1 -1
  59. package/esm/src/tools/entities.js +27 -47
  60. package/esm/src/tools/funnel.js +7 -7
  61. package/esm/src/tools/generic.d.ts +17 -4
  62. package/esm/src/tools/generic.d.ts.map +1 -1
  63. package/esm/src/tools/generic.js +39 -14
  64. package/esm/src/tools/keywords.js +5 -5
  65. package/esm/src/tools/personas.d.ts +49 -2
  66. package/esm/src/tools/personas.d.ts.map +1 -1
  67. package/esm/src/tools/personas.js +59 -35
  68. package/esm/src/tools/scorer.d.ts +24 -6
  69. package/esm/src/tools/scorer.d.ts.map +1 -1
  70. package/esm/src/tools/scorer.js +27 -22
  71. package/esm/src/tools/search.d.ts.map +1 -1
  72. package/esm/src/tools/search.js +33 -9
  73. package/esm/src/tools/sentiment.d.ts +30 -8
  74. package/esm/src/tools/sentiment.d.ts.map +1 -1
  75. package/esm/src/tools/sentiment.js +33 -28
  76. package/esm/src/tools/sources.d.ts +5 -5
  77. package/esm/src/tools/sources.d.ts.map +1 -1
  78. package/esm/src/tools/sources.js +5 -6
  79. package/esm/src/tools/topics.d.ts +44 -16
  80. package/esm/src/tools/topics.d.ts.map +1 -1
  81. package/esm/src/tools/topics.js +77 -68
  82. package/esm/src/tools/translate.d.ts +22 -31
  83. package/esm/src/tools/translate.d.ts.map +1 -1
  84. package/esm/src/tools/translate.js +40 -36
  85. package/package.json +2 -1
  86. package/script/browser.d.ts +1 -1
  87. package/script/browser.d.ts.map +1 -1
  88. package/script/browser.js +1 -1
  89. package/script/mod.d.ts +5 -2
  90. package/script/mod.d.ts.map +1 -1
  91. package/script/mod.js +14 -2
  92. package/script/src/api.d.ts +36 -5
  93. package/script/src/api.d.ts.map +1 -1
  94. package/script/src/api.js +84 -35
  95. package/script/src/apis/chatgptScraper/brightdata.js +1 -1
  96. package/script/src/apis/chatgptScraper/oxy.js +1 -1
  97. package/script/src/apis/chatgptScraper/scraper.js +2 -2
  98. package/script/src/apis/hasdata/aim.js +1 -1
  99. package/script/src/apis/hasdata/aio.js +1 -1
  100. package/script/src/apis/hasdata/helpers.d.ts +1 -1
  101. package/script/src/apis/hasdata/helpers.d.ts.map +1 -1
  102. package/script/src/apis/hasdata/helpers.js +2 -2
  103. package/script/src/assets/models.d.ts +60725 -0
  104. package/script/src/assets/models.d.ts.map +1 -0
  105. package/script/src/assets/models.js +71917 -0
  106. package/script/src/helpers/async.d.ts.map +1 -0
  107. package/script/src/{async.js → helpers/async.js} +1 -1
  108. package/script/src/helpers/seedKeywords.d.ts.map +1 -0
  109. package/script/src/helpers/urls.d.ts.map +1 -0
  110. package/script/src/helpers/utils.d.ts.map +1 -0
  111. package/script/src/llm.d.ts +35 -0
  112. package/script/src/llm.d.ts.map +1 -0
  113. package/script/src/llm.js +65 -0
  114. package/script/src/providers/google.d.ts +12 -0
  115. package/script/src/providers/google.d.ts.map +1 -0
  116. package/script/src/providers/google.js +148 -0
  117. package/script/src/providers/index.d.ts +13 -0
  118. package/script/src/providers/index.d.ts.map +1 -0
  119. package/script/src/providers/index.js +24 -0
  120. package/script/src/providers/openai.d.ts +12 -0
  121. package/script/src/providers/openai.d.ts.map +1 -0
  122. package/script/src/providers/openai.js +181 -0
  123. package/script/src/providers/pricing.d.ts +72 -0
  124. package/script/src/providers/pricing.d.ts.map +1 -0
  125. package/script/src/providers/pricing.js +97 -0
  126. package/script/src/providers/registry.d.ts +20 -0
  127. package/script/src/providers/registry.d.ts.map +1 -0
  128. package/script/src/providers/registry.js +39 -0
  129. package/script/src/providers/types.d.ts +49 -0
  130. package/script/src/providers/types.d.ts.map +1 -0
  131. package/script/src/providers/types.js +8 -0
  132. package/script/src/response.d.ts +74 -0
  133. package/script/src/response.d.ts.map +1 -0
  134. package/script/src/response.js +114 -0
  135. package/script/src/tool.d.ts +58 -0
  136. package/script/src/tool.d.ts.map +1 -0
  137. package/script/src/tool.js +95 -0
  138. package/script/src/tools/brands.js +6 -6
  139. package/script/src/tools/classifier.d.ts +80 -17
  140. package/script/src/tools/classifier.d.ts.map +1 -1
  141. package/script/src/tools/classifier.js +72 -85
  142. package/script/src/tools/entities.d.ts +23 -12
  143. package/script/src/tools/entities.d.ts.map +1 -1
  144. package/script/src/tools/entities.js +29 -51
  145. package/script/src/tools/funnel.js +7 -7
  146. package/script/src/tools/generic.d.ts +17 -4
  147. package/script/src/tools/generic.d.ts.map +1 -1
  148. package/script/src/tools/generic.js +39 -14
  149. package/script/src/tools/keywords.js +5 -5
  150. package/script/src/tools/personas.d.ts +49 -2
  151. package/script/src/tools/personas.d.ts.map +1 -1
  152. package/script/src/tools/personas.js +63 -36
  153. package/script/src/tools/scorer.d.ts +24 -6
  154. package/script/src/tools/scorer.d.ts.map +1 -1
  155. package/script/src/tools/scorer.js +28 -24
  156. package/script/src/tools/search.d.ts.map +1 -1
  157. package/script/src/tools/search.js +69 -9
  158. package/script/src/tools/sentiment.d.ts +30 -8
  159. package/script/src/tools/sentiment.d.ts.map +1 -1
  160. package/script/src/tools/sentiment.js +37 -30
  161. package/script/src/tools/sources.d.ts +5 -5
  162. package/script/src/tools/sources.d.ts.map +1 -1
  163. package/script/src/tools/sources.js +4 -5
  164. package/script/src/tools/topics.d.ts +44 -16
  165. package/script/src/tools/topics.d.ts.map +1 -1
  166. package/script/src/tools/topics.js +80 -72
  167. package/script/src/tools/translate.d.ts +22 -31
  168. package/script/src/tools/translate.d.ts.map +1 -1
  169. package/script/src/tools/translate.js +43 -40
  170. package/esm/src/async.d.ts.map +0 -1
  171. package/esm/src/models.d.ts +0 -18
  172. package/esm/src/models.d.ts.map +0 -1
  173. package/esm/src/models.js +0 -48
  174. package/esm/src/openai.d.ts +0 -17
  175. package/esm/src/openai.d.ts.map +0 -1
  176. package/esm/src/openai.js +0 -136
  177. package/esm/src/tools/seedKeywords.d.ts.map +0 -1
  178. package/esm/src/urls.d.ts.map +0 -1
  179. package/esm/src/utils.d.ts.map +0 -1
  180. package/script/src/async.d.ts.map +0 -1
  181. package/script/src/models.d.ts +0 -18
  182. package/script/src/models.d.ts.map +0 -1
  183. package/script/src/models.js +0 -52
  184. package/script/src/openai.d.ts +0 -17
  185. package/script/src/openai.d.ts.map +0 -1
  186. package/script/src/openai.js +0 -175
  187. package/script/src/tools/seedKeywords.d.ts.map +0 -1
  188. package/script/src/urls.d.ts.map +0 -1
  189. package/script/src/utils.d.ts.map +0 -1
  190. /package/esm/src/{async.d.ts → helpers/async.d.ts} +0 -0
  191. /package/esm/src/{tools → helpers}/seedKeywords.d.ts +0 -0
  192. /package/esm/src/{tools → helpers}/seedKeywords.js +0 -0
  193. /package/esm/src/{urls.d.ts → helpers/urls.d.ts} +0 -0
  194. /package/esm/src/{urls.js → helpers/urls.js} +0 -0
  195. /package/esm/src/{utils.d.ts → helpers/utils.d.ts} +0 -0
  196. /package/esm/src/{utils.js → helpers/utils.js} +0 -0
  197. /package/script/src/{async.d.ts → helpers/async.d.ts} +0 -0
  198. /package/script/src/{tools → helpers}/seedKeywords.d.ts +0 -0
  199. /package/script/src/{tools → helpers}/seedKeywords.js +0 -0
  200. /package/script/src/{urls.d.ts → helpers/urls.d.ts} +0 -0
  201. /package/script/src/{urls.js → helpers/urls.js} +0 -0
  202. /package/script/src/{utils.d.ts → helpers/utils.d.ts} +0 -0
  203. /package/script/src/{utils.js → helpers/utils.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
2
- import { type AIParams } from '../openai.js';
2
+ import { Tool, type ModelConfig } from '../tool.js';
3
+ import type { Message } from '../llm.js';
3
4
  import { type TopicType, type TaxonomyType, type TopicLabel } from '../schemas/topics.schema.js';
4
5
  export type { TopicType, TaxonomyType, TopicLabel };
5
6
  /**
@@ -48,27 +49,54 @@ export declare function createLabelSchema(taxonomy: TaxonomyType): z.ZodObject<{
48
49
  [x: string]: string;
49
50
  }>;
50
51
  }, z.core.$strip>;
51
- /**
52
- * Assigns a topic and subtopic to a single text using an LLM call.
53
- */
54
- export declare function assignTopic(text: string | null, taxonomy: TaxonomyType | Array<TopicType> | string, labelSchema: z.ZodType<TopicLabel>, model?: string, modelParams?: AIParams): Promise<TopicLabel | null>;
55
- /**
56
- * Assigns topics to multiple texts concurrently while preserving order.
57
- */
58
- export declare function assignTopics(texts: Array<string | null>, taxonomy: TaxonomyType | Array<TopicType>, model?: string, modelParams?: AIParams, maxConcurrency?: number): Promise<Array<TopicLabel | null>>;
59
- export interface TopicExtractionOptions {
60
- records: Array<Record<string, unknown>>;
52
+ export interface TopicExtractorConfig {
53
+ /** Maximum number of top-level topics (default: 10) */
61
54
  nTopics?: number;
55
+ /** Maximum number of subtopics per topic (default: 5) */
62
56
  nSubtopics?: number;
57
+ /** Additional instructions */
63
58
  instructions?: string;
59
+ /** Maximum number of records to sample (default: 500) */
64
60
  maxSamples?: number;
65
- model?: string;
66
- modelParams?: AIParams;
67
- maxRetries?: number;
61
+ /** Language for topics (default: same as records) */
68
62
  language?: string;
69
63
  }
70
64
  /**
71
- * Extracts a topic hierarchy from an array of records using an LLM.
65
+ * A tool that extracts a topic taxonomy from a set of records.
72
66
  */
73
- export declare function extractTopics({ records, nTopics, nSubtopics, instructions, maxSamples, model, modelParams, maxRetries, language }: TopicExtractionOptions): Promise<TaxonomyType>;
67
+ export declare class TopicExtractor extends Tool<Array<Record<string, unknown>>, TaxonomyType, TaxonomyType> {
68
+ private readonly maxSamples;
69
+ private readonly promptTemplate;
70
+ constructor(config: TopicExtractorConfig | undefined, modelConfig: ModelConfig);
71
+ protected schema(): z.ZodObject<{
72
+ topics: z.ZodArray<z.ZodObject<{
73
+ topic: z.ZodString;
74
+ subtopics: z.ZodArray<z.ZodString>;
75
+ }, z.core.$strip>>;
76
+ }, z.core.$strip>;
77
+ protected prompt(records: Array<Record<string, unknown>>): string;
78
+ protected isEmpty(records: Array<Record<string, unknown>>): boolean;
79
+ /**
80
+ * Not supported. TopicExtractor is an aggregation operation that extracts
81
+ * a single taxonomy from many records. Use invoke() instead.
82
+ */
83
+ batch(): never;
84
+ }
85
+ /**
86
+ * Configuration for the TopicAssigner tool.
87
+ */
88
+ export interface TopicAssignerConfig {
89
+ taxonomy: TaxonomyType | Array<TopicType>;
90
+ }
91
+ /**
92
+ * A tool that assigns topic and subtopic labels to text based on a taxonomy.
93
+ */
94
+ export declare class TopicAssigner extends Tool<string | null, TopicLabel, TopicLabel> {
95
+ private readonly labelSchema;
96
+ private readonly systemPrompt;
97
+ constructor(config: TopicAssignerConfig, modelConfig: ModelConfig);
98
+ protected schema(): z.ZodType<TopicLabel, unknown, z.core.$ZodTypeInternals<TopicLabel, unknown>>;
99
+ protected prompt(text: string | null): Message[];
100
+ protected isEmpty(text: string | null): boolean;
101
+ }
74
102
  //# sourceMappingURL=topics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../../src/src/tools/topics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAElE,OAAO,EAAsC,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEjF,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,MAAM,6BAA6B,CAAC;AAIrC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAuEpD;;;GAGG;AACH,eAAO,MAAM,KAAK;;;iBAShB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;iBAEvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;iBAEnB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAKpH;AACD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY;;;;;;;kBAmBvD;AA+CD;;GAEG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,EAClD,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAClC,KAAK,GAAE,MAAkB,EACzB,WAAW,GAAE,QAA4C,GACvD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA2B5B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAC3B,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,EACzC,KAAK,GAAE,MAAkB,EACzB,WAAW,GAAE,QAA4C,EACzD,cAAc,GAAE,MAAY,GAC1B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAgBnC;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,EACnC,OAAO,EACP,OAAY,EACZ,UAAc,EACd,YAAiB,EACjB,UAAgB,EAChB,KAAiB,EACjB,WAAgB,EAChB,UAAc,EACd,QAA6C,EAC7C,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsChD"}
1
+ {"version":3,"file":"topics.d.ts","sourceRoot":"","sources":["../../../src/src/tools/topics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAEN,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,MAAM,6BAA6B,CAAC;AAIrC,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AA+EpD;;;GAGG;AACH,eAAO,MAAM,KAAK;;;iBAShB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;iBAEvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;iBAEnB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAKpH;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY;;;;;;;kBAmBvD;AA+BD,MAAM,WAAW,oBAAoB;IACpC,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,IAAI,CACvC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC9B,YAAY,EACZ,YAAY,CACZ;IACA,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,EAAE,oBAAoB,YAAK,EAAE,WAAW,EAAE,WAAW;cAkBpD,MAAM;;;;;;IAIzB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;cAQrC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO;IAI5E;;;OAGG;IACM,KAAK,IAAI,KAAK;CAOvB;AAyBD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW;cAiB9C,MAAM;IAIzB,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,EAAE;cAQ7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;CAGxD"}
@@ -1,9 +1,11 @@
1
1
  /* eslint no-console: ["warn", { allow: ["log", "warn", "error"] }] */
2
2
  import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
3
- import { mapParallel } from '../async.js';
4
- import { askOpenAISafe } from '../openai.js';
3
+ import { Tool } from '../tool.js';
5
4
  import { TopicSchema } from '../schemas/topics.schema.js';
6
- import { dedent, formatRecordsAttrWise } from '../utils.js';
5
+ import { dedent, formatRecordsAttrWise } from '../helpers/utils.js';
6
+ // =============================================================================
7
+ // Helper Functions
8
+ // =============================================================================
7
9
  /**
8
10
  * Levenshtein distance implementation for string similarity validation
9
11
  */
@@ -61,6 +63,9 @@ function validateSubtopics(topic, subtopics) {
61
63
  }
62
64
  return errors;
63
65
  }
66
+ // =============================================================================
67
+ // Schemas
68
+ // =============================================================================
64
69
  /**
65
70
  * Topic schema with subtopic validation
66
71
  * Validates that subtopics are sufficiently distinct from each other and from the parent topic.
@@ -120,6 +125,9 @@ export function createLabelSchema(taxonomy) {
120
125
  }
121
126
  });
122
127
  }
128
+ // =============================================================================
129
+ // TopicExtractor
130
+ // =============================================================================
123
131
  const TOPICS_PROMPT = dedent(`
124
132
  # Instructions
125
133
 
@@ -144,6 +152,48 @@ The taxonomy should follow the MECE framework (Mutually Exclusive, Collectively
144
152
 
145
153
  {records}
146
154
  `);
155
+ /**
156
+ * A tool that extracts a topic taxonomy from a set of records.
157
+ */
158
+ export class TopicExtractor extends Tool {
159
+ maxSamples;
160
+ promptTemplate;
161
+ constructor(config = {}, modelConfig) {
162
+ super(modelConfig);
163
+ const { nTopics = 10, nSubtopics = 5, instructions = '', maxSamples = 500, language = 'The same language as the records' } = config;
164
+ this.maxSamples = maxSamples;
165
+ this.promptTemplate = TOPICS_PROMPT
166
+ .replace('{n_topics}', String(nTopics))
167
+ .replace('{n_subtopics}', String(nSubtopics))
168
+ .replace('{instructions}', instructions)
169
+ .replace('{language}', language);
170
+ }
171
+ schema() {
172
+ return Taxonomy;
173
+ }
174
+ prompt(records) {
175
+ const sampledRecords = records.length > this.maxSamples
176
+ ? records.slice(0, this.maxSamples)
177
+ : records;
178
+ const formattedRecords = formatRecordsAttrWise(sampledRecords);
179
+ return this.promptTemplate.replace('{records}', formattedRecords);
180
+ }
181
+ isEmpty(records) {
182
+ return !records || records.length === 0;
183
+ }
184
+ /**
185
+ * Not supported. TopicExtractor is an aggregation operation that extracts
186
+ * a single taxonomy from many records. Use invoke() instead.
187
+ */
188
+ batch() {
189
+ throw new Error('TopicExtractor.batch() is not supported. ' +
190
+ 'This tool extracts a single taxonomy from many records (aggregation). ' +
191
+ 'Use invoke() with all records instead.');
192
+ }
193
+ }
194
+ // =============================================================================
195
+ // TopicAssigner
196
+ // =============================================================================
147
197
  const LABEL_PROMPT_SYSTEM = dedent(`
148
198
  You're task is to use the following hierarchy of topics and subtopics (in json format),
149
199
  to assign the correct topic and subtopic to each text in the input.
@@ -162,74 +212,33 @@ Assign the correct topic and subtopic to the following text.
162
212
  {text}
163
213
  `);
164
214
  /**
165
- * Assigns a topic and subtopic to a single text using an LLM call.
215
+ * A tool that assigns topic and subtopic labels to text based on a taxonomy.
166
216
  */
167
- export async function assignTopic(text, taxonomy, labelSchema, model = 'gpt-5.1', modelParams = { reasoning: { effort: 'none' } }) {
168
- if (text == null || text.trim() === '') {
169
- return null;
170
- }
171
- const systemPrompt = LABEL_PROMPT_SYSTEM.replace('{taxonomy}', typeof taxonomy === 'string' ? taxonomy : JSON.stringify(taxonomy, null, 2));
172
- const userPrompt = LABEL_PROMPT_USER.replace('{text}', text);
173
- const prompts = [
174
- { role: 'system', content: systemPrompt },
175
- { role: 'user', content: userPrompt }
176
- ];
177
- try {
178
- const { parsed, error } = await askOpenAISafe(prompts, model, labelSchema, modelParams);
179
- if (error != null || parsed == null) {
180
- return null;
181
- }
182
- return parsed;
217
+ export class TopicAssigner extends Tool {
218
+ labelSchema;
219
+ systemPrompt;
220
+ constructor(config, modelConfig) {
221
+ super(modelConfig);
222
+ const { taxonomy } = config;
223
+ // Normalize taxonomy to TaxonomyType
224
+ const normalizedTaxonomy = Array.isArray(taxonomy)
225
+ ? { topics: taxonomy }
226
+ : taxonomy;
227
+ // Build schema and system prompt once in constructor
228
+ this.labelSchema = createLabelSchema(normalizedTaxonomy);
229
+ this.systemPrompt = LABEL_PROMPT_SYSTEM.replace('{taxonomy}', JSON.stringify(normalizedTaxonomy, null, 2));
183
230
  }
184
- catch (error) {
185
- console.warn(`Failed to assign topic for text "${text.substring(0, 50)}...":`, error);
186
- return null;
231
+ schema() {
232
+ return this.labelSchema;
187
233
  }
188
- }
189
- /**
190
- * Assigns topics to multiple texts concurrently while preserving order.
191
- */
192
- export function assignTopics(texts, taxonomy, model = 'gpt-5.1', modelParams = { reasoning: { effort: 'none' } }, maxConcurrency = 100) {
193
- // Precompute normalized taxonomy and label schema once for whole batch
194
- const normalizedTaxonomy = Array.isArray(taxonomy)
195
- ? { topics: taxonomy }
196
- : taxonomy;
197
- const labelSchema = createLabelSchema(normalizedTaxonomy);
198
- const serializedTaxonomy = JSON.stringify(normalizedTaxonomy, null, 2);
199
- return mapParallel(texts, maxConcurrency, text => assignTopic(text, serializedTaxonomy, labelSchema, model, modelParams));
200
- }
201
- /**
202
- * Extracts a topic hierarchy from an array of records using an LLM.
203
- */
204
- export async function extractTopics({ records, nTopics = 10, nSubtopics = 5, instructions = '', maxSamples = 500, model = 'gpt-4.1', modelParams = {}, maxRetries = 8, language = 'The same language as the records' }) {
205
- if (!records || records.length === 0) {
206
- return { topics: [] };
207
- }
208
- const sampledRecords = records.length > maxSamples
209
- ? records.slice(0, maxSamples)
210
- : records;
211
- const formattedRecords = formatRecordsAttrWise(sampledRecords);
212
- const prompt = TOPICS_PROMPT
213
- .replace('{n_topics}', String(nTopics))
214
- .replace('{n_subtopics}', String(nSubtopics))
215
- .replace('{instructions}', instructions)
216
- .replace('{records}', formattedRecords)
217
- .replace('{language}', language);
218
- const { parsed, output_text, error } = await askOpenAISafe(prompt, model, Taxonomy, modelParams, maxRetries, 'return');
219
- if (error != null) {
220
- if (output_text == null) {
221
- throw new Error('Failed to get response from OpenAI');
222
- }
223
- try {
224
- const taxonomy = JSON.parse(output_text);
225
- return TaxonomyBase.parse(taxonomy);
226
- }
227
- catch (parseError) {
228
- throw new Error(`Failed to parse response even without validation: ${parseError instanceof Error ? parseError.message : String(parseError)}`);
229
- }
234
+ prompt(text) {
235
+ const userPrompt = LABEL_PROMPT_USER.replace('{text}', text ?? '');
236
+ return [
237
+ { role: 'system', content: this.systemPrompt },
238
+ { role: 'user', content: userPrompt }
239
+ ];
230
240
  }
231
- if (parsed == null) {
232
- throw new Error('Failed to parse response from OpenAI');
241
+ isEmpty(text) {
242
+ return text == null || text.trim() === '';
233
243
  }
234
- return parsed;
235
244
  }
@@ -1,44 +1,35 @@
1
+ import { Tool, type ModelConfig } from '../tool.js';
1
2
  import type { BrandContext } from '../schemas/brand.schema.js';
2
- export interface translateParams {
3
- keyword: string;
3
+ export interface KeywordTranslatorConfig {
4
+ /** Brand context for disambiguation */
5
+ brandContext: BrandContext;
6
+ /** Language for the output prompt (default: 'en') */
4
7
  language?: string;
5
- model?: string;
8
+ /** Additional instructions */
6
9
  instructions?: string;
7
- brandContext: BrandContext;
8
10
  }
9
11
  /**
10
- * Translates a single Google search keyword into an equivalent LLM prompt.
12
+ * A tool that converts Google search keywords into natural language LLM prompts.
13
+ * Uses raw text mode (no schema) since the output is plain text.
11
14
  */
12
- export declare function translate({ keyword, language, model, brandContext, instructions }: translateParams): Promise<string>;
13
- /**
14
- * Translates multiple Google search keywords to LLM prompts concurrently while preserving order.
15
- */
16
- export interface translateBatchParams {
17
- keywords: Array<string>;
18
- language?: string;
19
- model?: string;
20
- maxConcurrency?: number;
21
- instructions?: string;
22
- brandContext: BrandContext;
15
+ export declare class KeywordTranslator extends Tool<string | null, string, string> {
16
+ private readonly promptTemplate;
17
+ constructor(config: KeywordTranslatorConfig, modelConfig: ModelConfig);
18
+ protected prompt(keyword: string | null): string;
19
+ protected isEmpty(keyword: string | null): boolean;
23
20
  }
24
- export declare function translateBatch(params: translateBatchParams): Promise<Array<string>>;
25
- export interface reverseTranslateParams {
26
- prompt: string;
21
+ export interface PromptToKeywordConfig {
22
+ /** Language for the output keyword (default: 'en') */
27
23
  language?: string;
28
- model?: string;
29
24
  }
30
25
  /**
31
- * Converts a natural language prompt into an equivalent Google search keyword.
26
+ * A tool that converts natural language prompts into Google search keywords.
27
+ * Uses raw text mode (no schema) since the output is plain text.
32
28
  */
33
- export declare function reverseTranslate({ prompt, language, model }: reverseTranslateParams): Promise<string>;
34
- export interface reverseTranslateBatchParams {
35
- prompts: Array<string>;
36
- language?: string;
37
- model?: string;
38
- maxConcurrency?: number;
29
+ export declare class PromptToKeyword extends Tool<string | null, string, string> {
30
+ private readonly promptTemplate;
31
+ constructor(config: PromptToKeywordConfig | undefined, modelConfig: ModelConfig);
32
+ protected prompt(text: string | null): string;
33
+ protected isEmpty(text: string | null): boolean;
39
34
  }
40
- /**
41
- * Converts multiple natural language prompts to Google search keywords concurrently while preserving order.
42
- */
43
- export declare function reverseTranslateBatch(params: reverseTranslateBatchParams): Promise<Array<string>>;
44
35
  //# sourceMappingURL=translate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../../src/src/tools/translate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA+C/D,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC9B,EAAE,OAAO,EAAE,QAAe,EAAE,KAAoB,EAAE,YAAY,EAAE,YAAiB,EAAE,EAAE,eAAe,GAClG,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED;;GAEG;AAEH,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;CAC3B;AAED,wBAAsB,cAAc,CACnC,MAAM,EAAE,oBAAoB,GAC1B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAQxB;AA+BD,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACrC,EAAE,MAAM,EAAE,QAAe,EAAE,KAAsB,EAAE,EAAE,sBAAsB,GACzE,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,2BAA2B,GACjC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAQxB"}
1
+ {"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../../src/src/tools/translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA+C/D,MAAM,WAAW,uBAAuB;IACvC,uCAAuC;IACvC,YAAY,EAAE,YAAY,CAAC;IAC3B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;IACzE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,WAAW;IAarE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;cAIpB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;CAG3D;AAmCD,MAAM,WAAW,qBAAqB;IACrC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,MAAM,EAAE,qBAAqB,YAAK,EAAE,WAAW,EAAE,WAAW;IASxE,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;cAIjB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;CAGxD"}
@@ -1,6 +1,5 @@
1
- import { mapParallel } from '../async.js';
2
- import { askOpenAISafe } from '../openai.js';
3
- import { dedent } from '../utils.js';
1
+ import { Tool } from '../tool.js';
2
+ import { dedent } from '../helpers/utils.js';
4
3
  const TRANSLATE_PROMPT = dedent(`
5
4
  You are an expert in understanding search intent and conversational AI interactions.
6
5
 
@@ -33,7 +32,7 @@ You will receive brand context (sector, country). Follow these rules strictly:
33
32
  - WRONG: "Tell me about geography" (ignores sector context)
34
33
  - CORRECT: "What is GEO in AI visibility and search optimization?" (uses sector to disambiguate the acronym)
35
34
 
36
- {additional_instructions}
35
+ {instructions}
37
36
 
38
37
  # Keyword
39
38
 
@@ -46,25 +45,31 @@ You will receive brand context (sector, country). Follow these rules strictly:
46
45
  Return only the converted prompt, nothing else.
47
46
  `);
48
47
  /**
49
- * Translates a single Google search keyword into an equivalent LLM prompt.
48
+ * A tool that converts Google search keywords into natural language LLM prompts.
49
+ * Uses raw text mode (no schema) since the output is plain text.
50
50
  */
51
- export async function translate({ keyword, language = 'en', model = 'gpt-5-mini', brandContext, instructions = '' }) {
52
- const prompt = TRANSLATE_PROMPT
53
- .replace('{keyword}', keyword)
54
- .replace('{language}', language)
55
- .replace('{sector}', brandContext.sector)
56
- .replace('{country}', brandContext.country)
57
- .replace('{additional_instructions}', instructions);
58
- const { parsed } = await askOpenAISafe(prompt, model);
59
- if (!parsed) {
60
- throw new Error('Failed to parse translation from OpenAI response');
51
+ export class KeywordTranslator extends Tool {
52
+ promptTemplate;
53
+ constructor(config, modelConfig) {
54
+ super(modelConfig);
55
+ const { brandContext, language = 'en', instructions = '' } = config;
56
+ this.promptTemplate = TRANSLATE_PROMPT
57
+ .replace('{language}', language)
58
+ .replace('{sector}', brandContext.sector)
59
+ .replace('{country}', brandContext.country)
60
+ .replace('{instructions}', instructions);
61
+ }
62
+ // No schema() override - uses default null for raw text mode
63
+ prompt(keyword) {
64
+ return this.promptTemplate.replace('{keyword}', keyword ?? '');
65
+ }
66
+ isEmpty(keyword) {
67
+ return keyword == null || keyword.trim() === '';
61
68
  }
62
- return parsed;
63
- }
64
- export async function translateBatch(params) {
65
- const { keywords, language = 'en', model = 'gpt-4.1-mini', maxConcurrency = 100, brandContext, instructions = '' } = params;
66
- return mapParallel(keywords, maxConcurrency, kwd => translate({ keyword: kwd, language, model, brandContext, instructions }));
67
69
  }
70
+ // =============================================================================
71
+ // PromptToKeyword (LLM prompt → keyword)
72
+ // =============================================================================
68
73
  const REVERSE_TRANSLATE_PROMPT = dedent(`
69
74
  You are an expert in understanding search intent.
70
75
 
@@ -94,22 +99,21 @@ Otherwise, Google keyword planner will not accept it.
94
99
  Return only the keyword, nothing else.
95
100
  `);
96
101
  /**
97
- * Converts a natural language prompt into an equivalent Google search keyword.
102
+ * A tool that converts natural language prompts into Google search keywords.
103
+ * Uses raw text mode (no schema) since the output is plain text.
98
104
  */
99
- export async function reverseTranslate({ prompt, language = 'en', model = 'gpt-4.1-mini' }) {
100
- const requestPrompt = REVERSE_TRANSLATE_PROMPT
101
- .replace('{prompt}', prompt)
102
- .replace('{language}', language);
103
- const { parsed } = await askOpenAISafe(requestPrompt, model);
104
- if (!parsed) {
105
- throw new Error('Failed to parse reverse translation from OpenAI response');
105
+ export class PromptToKeyword extends Tool {
106
+ promptTemplate;
107
+ constructor(config = {}, modelConfig) {
108
+ super(modelConfig);
109
+ const { language = 'en' } = config;
110
+ this.promptTemplate = REVERSE_TRANSLATE_PROMPT.replace('{language}', language);
111
+ }
112
+ // No schema() override - uses default null for raw text mode
113
+ prompt(text) {
114
+ return this.promptTemplate.replace('{prompt}', text ?? '');
115
+ }
116
+ isEmpty(text) {
117
+ return text == null || text.trim() === '';
106
118
  }
107
- return parsed;
108
- }
109
- /**
110
- * Converts multiple natural language prompts to Google search keywords concurrently while preserving order.
111
- */
112
- export async function reverseTranslateBatch(params) {
113
- const { prompts, language = 'en', model = 'gpt-5-mini', maxConcurrency = 100 } = params;
114
- return mapParallel(prompts, maxConcurrency, p => reverseTranslate({ prompt: p, language, model }));
115
119
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphext/cuery",
3
- "version": "0.4.0",
3
+ "version": "0.5.2",
4
4
  "description": "Cuery tools for AI-powered keyword research and brand analysis",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,6 +24,7 @@
24
24
  },
25
25
  "scripts": {},
26
26
  "dependencies": {
27
+ "@google/genai": "^1.37.0",
27
28
  "google-auth-library": "^10.4.0",
28
29
  "openai": "^6.9.1",
29
30
  "tldts": "^6.1.71",
@@ -8,5 +8,5 @@
8
8
  * @module
9
9
  */
10
10
  export * from './src/schemas/index.js';
11
- export * from './src/tools/seedKeywords.js';
11
+ export * from './src/helpers/seedKeywords.js';
12
12
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,wBAAwB,CAAC;AAGvC,cAAc,6BAA6B,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/script/browser.js CHANGED
@@ -26,4 +26,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  // Types and schemas (no runtime dependencies)
27
27
  __exportStar(require("./src/schemas/index.js"), exports);
28
28
  // Pure functions for seed keyword handling (no external dependencies)
29
- __exportStar(require("./src/tools/seedKeywords.js"), exports);
29
+ __exportStar(require("./src/helpers/seedKeywords.js"), exports);
package/script/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/tools/seedKeywords.js';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,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,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,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,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/script/mod.js CHANGED
@@ -19,19 +19,31 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
19
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
20
  };
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.calculateCost = exports.getModelInfo = exports.getModelPricing = exports.getProviderForModel = exports.getProvider = exports.BatchResponse = void 0;
23
+ // Core LLM interface and types
24
+ __exportStar(require("./src/llm.js"), exports);
25
+ var response_js_1 = require("./src/response.js");
26
+ Object.defineProperty(exports, "BatchResponse", { enumerable: true, get: function () { return response_js_1.BatchResponse; } });
27
+ var index_js_1 = require("./src/providers/index.js");
28
+ Object.defineProperty(exports, "getProvider", { enumerable: true, get: function () { return index_js_1.getProvider; } });
29
+ Object.defineProperty(exports, "getProviderForModel", { enumerable: true, get: function () { return index_js_1.getProviderForModel; } });
30
+ Object.defineProperty(exports, "getModelPricing", { enumerable: true, get: function () { return index_js_1.getModelPricing; } });
31
+ Object.defineProperty(exports, "getModelInfo", { enumerable: true, get: function () { return index_js_1.getModelInfo; } });
32
+ Object.defineProperty(exports, "calculateCost", { enumerable: true, get: function () { return index_js_1.calculateCost; } });
33
+ // Tools
22
34
  __exportStar(require("./src/tools/keywords.js"), exports);
23
35
  __exportStar(require("./src/tools/classifier.js"), exports);
24
36
  __exportStar(require("./src/tools/funnel.js"), exports);
25
37
  __exportStar(require("./src/tools/personas.js"), exports);
26
38
  __exportStar(require("./src/tools/search.js"), exports);
27
39
  __exportStar(require("./src/tools/topics.js"), exports);
28
- __exportStar(require("./src/utils.js"), exports);
40
+ __exportStar(require("./src/helpers/utils.js"), exports);
29
41
  __exportStar(require("./src/tools/brands.js"), exports);
30
42
  __exportStar(require("./src/tools/translate.js"), exports);
31
43
  __exportStar(require("./src/tools/sentiment.js"), exports);
32
44
  __exportStar(require("./src/tools/sources.js"), exports);
33
45
  __exportStar(require("./src/tools/entities.js"), exports);
34
- __exportStar(require("./src/tools/seedKeywords.js"), exports);
46
+ __exportStar(require("./src/helpers/seedKeywords.js"), exports);
35
47
  __exportStar(require("./src/tools/generic.js"), exports);
36
48
  __exportStar(require("./src/api.js"), exports);
37
49
  __exportStar(require("./src/apis/chatgptScraper/index.js"), exports);
@@ -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 | ModelId, searchCountry?: string | null): Promise<Array<ModelResponse>>;
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