@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../../src/src/helpers/async.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1E;AAMD,MAAM,WAAW,WAAW;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,cAAc;;;;;;CAM1B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,WAAW,CAChC,EAAE,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,EAC3B,EACC,UAAsC,EACtC,YAA0C,EAC1C,QAAkC,EAClC,iBAAoD,EACpD,WAAwC,EACxC,GAAE,WAAgB,GACjB,OAAO,CAAC,QAAQ,CAAC,CA+CnB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACrC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EACzC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CA0BnB"}
@@ -8,7 +8,7 @@
8
8
  * Sleeps for a specified duration. If an AbortSignal is provided and triggered,
9
9
  * the promise rejects with the abort reason and the timeout is cleared.
10
10
  */
11
- import * as dntShim from "../_dnt.shims.js";
11
+ import * as dntShim from "../../_dnt.shims.js";
12
12
  export function sleep(ms, abortSignal) {
13
13
  return new Promise((resolve, reject) => {
14
14
  if (abortSignal?.aborted) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seedKeywords.d.ts","sourceRoot":"","sources":["../../../src/src/helpers/seedKeywords.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAOpE,UAAU,iBAAiB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,UAAU,WAAW;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,UAAU,kBAAkB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED,UAAU,eAAe;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;CACvC;AAED,UAAU,cAAc;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;CACrC;AAMD,MAAM,WAAW,yBAAyB;IACzC,cAAc,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC1C,QAAQ,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EACnC,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,cAAc,EACd,EAAE,yBAAyB,GAAG,KAAK,CAAC,WAAW,CAAC,CA+EhD;AAcD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAChC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,EAChC,sBAAsB,GAAE,OAAc,GACpC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CA8FzC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,EAChC,sBAAsB,GAAE,OAAc,GACpC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAS/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC5C,MAAM,EAAE,yBAAyB,EACjC,sBAAsB,GAAE,OAAc,GACpC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAG/B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../../src/src/helpers/urls.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAQzC;AAaD;;;GAGG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,aAAa,GAAE,OAAe,EAC9B,sBAAsB,GAAE,OAAc,GACpC,MAAM,CA6BR"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/src/helpers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8B3C;AAwCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAMD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAoCrF;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAYnE;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5D,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,MAAM,CAAC,GACZ,KAAK,CAAC,CAAC,CAAC,CAoBV;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,MAAM,CAAC,GACZ,KAAK,CAAC,CAAC,CAAC,CAgBV"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Unified LLM interface - provider-agnostic API for making LLM calls.
3
+ */
4
+ import type { z } from '../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
5
+ import { type Message, type LLMResponse, type ProviderParams } from './providers/index.js';
6
+ export type { Message, LLMResponse, LLMProvider, ProviderParams, LLMConversation } from './providers/index.js';
7
+ export type { TokenUsage, UsageCost, AggregatedUsage } from './response.js';
8
+ export { calculateCost } from './providers/index.js';
9
+ /**
10
+ * Parameters for askLLMSafe.
11
+ */
12
+ export interface AskLLMParams<T = string> {
13
+ /** The prompt (string or message array) */
14
+ prompt: string | Message[];
15
+ /** The model to use (e.g., 'gpt-4.1-mini', 'gemini-2.0-flash') */
16
+ model: string;
17
+ /** Optional Zod schema for structured output */
18
+ schema?: z.ZodType<T> | null;
19
+ /** Provider-specific parameters */
20
+ params?: ProviderParams;
21
+ /** Maximum retry attempts (default: 3) */
22
+ maxRetries?: number;
23
+ /** Error handling mode: 'throw' or 'return' (default: 'throw') */
24
+ onError?: 'throw' | 'return';
25
+ }
26
+ /**
27
+ * Make a single LLM call with retry logic.
28
+ * Returns LLMResponse with raw TokenUsage (no cost calculation).
29
+ */
30
+ export declare function askLLMSafe<T = string>({ prompt, model, schema, params, maxRetries, onError, }: AskLLMParams<T>): Promise<LLMResponse<T>>;
31
+ /**
32
+ * Make a single LLM call without retry logic.
33
+ */
34
+ export declare function askLLM<T = string>(params: Omit<AskLLMParams<T>, 'maxRetries' | 'onError'>): Promise<LLMResponse<T>>;
35
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/src/llm.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,4CAA4C,CAAC;AACpE,OAAO,EAAuB,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGhH,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG/G,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,MAAM;IACvC,2CAA2C;IAC3C,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;IAC3B,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7B,mCAAmC;IACnC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAYD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,MAAM,EAAE,EAC5C,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,UAAc,EACd,OAAiB,GACjB,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAwC3C;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,MAAM,EACtC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC,GACrD,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAEzB"}
package/esm/src/llm.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Unified LLM interface - provider-agnostic API for making LLM calls.
3
+ */
4
+ import { getProviderForModel } from './providers/index.js';
5
+ export { calculateCost } from './providers/index.js';
6
+ /**
7
+ * Normalize a prompt to a message array.
8
+ */
9
+ function normalizePrompt(prompt) {
10
+ if (Array.isArray(prompt)) {
11
+ return prompt;
12
+ }
13
+ return [{ role: 'user', content: prompt }];
14
+ }
15
+ /**
16
+ * Make a single LLM call with retry logic.
17
+ * Returns LLMResponse with raw TokenUsage (no cost calculation).
18
+ */
19
+ export async function askLLMSafe({ prompt, model, schema, params, maxRetries = 3, onError = 'throw', }) {
20
+ const provider = getProviderForModel(model);
21
+ let messages = normalizePrompt(prompt);
22
+ let lastResponse = null;
23
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
24
+ const response = await provider.complete(messages, model, schema ?? null, params);
25
+ if (response.error === null && response.parsed !== null) {
26
+ return response;
27
+ }
28
+ lastResponse = {
29
+ parsed: null,
30
+ text: response.text,
31
+ usage: response.usage,
32
+ error: response.error ?? new Error('Unknown error'),
33
+ };
34
+ if (attempt < maxRetries && response.error) {
35
+ // Add error context to messages for retry
36
+ const errorMessage = `Previous attempt failed with error: ${response.error.message}`;
37
+ if (response.text) {
38
+ messages = [
39
+ ...messages,
40
+ {
41
+ role: 'system',
42
+ content: `${errorMessage}\nYour raw response was:\n${response.text}`,
43
+ },
44
+ ];
45
+ }
46
+ console.log(`askLLMSafe retrying! Attempt ${attempt + 1} failed: ${response.error.message}`);
47
+ }
48
+ }
49
+ if (onError === 'return') {
50
+ return lastResponse;
51
+ }
52
+ throw lastResponse.error;
53
+ }
54
+ /**
55
+ * Make a single LLM call without retry logic.
56
+ */
57
+ export async function askLLM(params) {
58
+ return askLLMSafe({ ...params, maxRetries: 0, onError: 'throw' });
59
+ }
@@ -0,0 +1,12 @@
1
+ import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
2
+ import type { LLMProvider, LLMResponse, Message, ProviderParams } from './types.js';
3
+ /**
4
+ * Google LLM provider (for Gemini models).
5
+ */
6
+ export declare class GoogleProvider implements LLMProvider {
7
+ readonly name = "google";
8
+ private client;
9
+ constructor(apiKey?: string);
10
+ complete<T>(messages: Message[], model: string, schema: z.ZodType<T> | null, params?: ProviderParams): Promise<LLMResponse<T>>;
11
+ }
12
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/src/providers/google.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAuCpF;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,CAAC,EAAE,MAAM;IAUrB,QAAQ,CAAC,CAAC,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAC3B,MAAM,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CA8D1B"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Google provider implementation (for Gemini models).
3
+ */
4
+ import * as dntShim from "../../_dnt.shims.js";
5
+ import { GoogleGenAI } from '@google/genai';
6
+ import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
7
+ /**
8
+ * Convert messages to Gemini content format.
9
+ * Handles system prompts by prepending them as context.
10
+ */
11
+ function convertMessages(messages) {
12
+ // For simple single message, return as string
13
+ if (messages.length === 1 && messages[0].role === 'user') {
14
+ return messages[0].content;
15
+ }
16
+ // Build system instruction and contents separately
17
+ const systemParts = [];
18
+ const contents = [];
19
+ for (const msg of messages) {
20
+ if (msg.role === 'system') {
21
+ systemParts.push(msg.content);
22
+ }
23
+ else {
24
+ contents.push({
25
+ role: msg.role === 'assistant' ? 'model' : 'user',
26
+ parts: [{ text: msg.content }],
27
+ });
28
+ }
29
+ }
30
+ // If we have system prompts, prepend to the first user message
31
+ if (systemParts.length > 0 && contents.length > 0) {
32
+ const systemContext = systemParts.join('\n\n');
33
+ const firstContent = contents[0];
34
+ if (firstContent.role === 'user' && firstContent.parts.length > 0) {
35
+ firstContent.parts[0].text = `${systemContext}\n\n${firstContent.parts[0].text}`;
36
+ }
37
+ }
38
+ return contents;
39
+ }
40
+ /**
41
+ * Google LLM provider (for Gemini models).
42
+ */
43
+ export class GoogleProvider {
44
+ name = 'google';
45
+ client;
46
+ constructor(apiKey) {
47
+ const resolvedKey = apiKey ?? dntShim.Deno.env.get('GOOGLE_API_KEY') ?? dntShim.Deno.env.get('GEMINI_API_KEY');
48
+ if (!resolvedKey) {
49
+ throw new Error('GOOGLE_API_KEY or GEMINI_API_KEY environment variable is required');
50
+ }
51
+ this.client = new GoogleGenAI({ apiKey: resolvedKey });
52
+ }
53
+ async complete(messages, model, schema, params) {
54
+ try {
55
+ const config = {
56
+ ...(params ?? {}),
57
+ };
58
+ if (schema != null) {
59
+ config.responseMimeType = 'application/json';
60
+ config.responseSchema = z.toJSONSchema(schema, { target: 'draft-7' });
61
+ }
62
+ const response = await this.client.models.generateContent({
63
+ model,
64
+ contents: convertMessages(messages),
65
+ config,
66
+ });
67
+ const text = response.text ?? '';
68
+ const usageMetadata = response.usageMetadata;
69
+ const usage = usageMetadata
70
+ ? {
71
+ inputTokens: usageMetadata.promptTokenCount ?? 0,
72
+ outputTokens: usageMetadata.candidatesTokenCount ?? 0,
73
+ totalTokens: usageMetadata.totalTokenCount ?? 0,
74
+ }
75
+ : null;
76
+ if (schema != null) {
77
+ try {
78
+ const parsed = schema.parse(JSON.parse(text));
79
+ return {
80
+ parsed,
81
+ text,
82
+ usage,
83
+ error: null,
84
+ };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ parsed: null,
89
+ text,
90
+ usage,
91
+ error: error instanceof Error ? error : new Error(String(error)),
92
+ };
93
+ }
94
+ }
95
+ return {
96
+ parsed: text,
97
+ text,
98
+ usage,
99
+ error: null,
100
+ };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ parsed: null,
105
+ text: null,
106
+ usage: null,
107
+ error: error instanceof Error ? error : new Error(String(error)),
108
+ };
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Provider registry and pricing.
3
+ *
4
+ * This module consolidates all provider-related functionality:
5
+ * - Provider implementations (OpenAI, Google)
6
+ * - Cost calculation utilities
7
+ */
8
+ export { getProvider, getProviderForModel } from './registry.js';
9
+ export { OpenAIProvider } from './openai.js';
10
+ export { GoogleProvider } from './google.js';
11
+ export { getModelPricing, getModelInfo, calculateCost, type ModelPricing, type ModelInfo, } from './pricing.js';
12
+ export type { Message, LLMResponse, LLMProvider, ProviderParams, LLMConversation, } from './types.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EACN,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,cAAc,CAAC;AAGtB,YAAY,EACX,OAAO,EACP,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Provider registry and pricing.
3
+ *
4
+ * This module consolidates all provider-related functionality:
5
+ * - Provider implementations (OpenAI, Google)
6
+ * - Cost calculation utilities
7
+ */
8
+ // Re-export provider registry functions
9
+ export { getProvider, getProviderForModel } from './registry.js';
10
+ // Re-export provider implementations
11
+ export { OpenAIProvider } from './openai.js';
12
+ export { GoogleProvider } from './google.js';
13
+ // Re-export pricing utilities
14
+ export { getModelPricing, getModelInfo, calculateCost, } from './pricing.js';
@@ -0,0 +1,12 @@
1
+ import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
2
+ import type { LLMProvider, LLMResponse, Message, ProviderParams } from './types.js';
3
+ /**
4
+ * OpenAI LLM provider.
5
+ */
6
+ export declare class OpenAIProvider implements LLMProvider {
7
+ readonly name = "openai";
8
+ private client;
9
+ constructor(apiKey?: string);
10
+ complete<T>(messages: Message[], model: string, schema: z.ZodType<T> | null, params?: ProviderParams): Promise<LLMResponse<T>>;
11
+ }
12
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/src/providers/openai.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,+CAA+C,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyFpF;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IACjD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAarB,QAAQ,CAAC,CAAC,EACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAC3B,MAAM,CAAC,EAAE,cAAc,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAkD1B"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * OpenAI provider implementation.
3
+ */
4
+ import * as dntShim from "../../_dnt.shims.js";
5
+ import OpenAI from 'openai';
6
+ import { z } from '../../deps/jsr.io/@zod/zod/4.3.6/src/index.js';
7
+ const zodTextFormatCache = new Map();
8
+ class ZodValidationError extends Error {
9
+ }
10
+ /**
11
+ * Sanitizes a JSON schema for OpenAI compatibility.
12
+ * OpenAI's structured output has strict requirements:
13
+ * - additionalProperties must be false (not empty object or missing)
14
+ * - propertyNames is not permitted
15
+ */
16
+ function sanitizeSchemaForOpenAI(schema) {
17
+ const result = {};
18
+ for (const [key, value] of Object.entries(schema)) {
19
+ // Remove unsupported keys
20
+ if (key === 'propertyNames') {
21
+ continue;
22
+ }
23
+ // Handle additionalProperties - set to false for strict mode
24
+ if (key === 'additionalProperties') {
25
+ result[key] = false;
26
+ continue;
27
+ }
28
+ // Recursively sanitize nested objects
29
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
30
+ result[key] = sanitizeSchemaForOpenAI(value);
31
+ }
32
+ else if (Array.isArray(value)) {
33
+ result[key] = value.map(item => item && typeof item === 'object' && !Array.isArray(item)
34
+ ? sanitizeSchemaForOpenAI(item)
35
+ : item);
36
+ }
37
+ else {
38
+ result[key] = value;
39
+ }
40
+ }
41
+ // For object types without additionalProperties, add it as false
42
+ if (result['type'] === 'object' && !('additionalProperties' in result)) {
43
+ result['additionalProperties'] = false;
44
+ }
45
+ return result;
46
+ }
47
+ function getCachedZodTextFormat(zodObject, name) {
48
+ const cached = zodTextFormatCache.get(zodObject);
49
+ if (cached && cached.name === name) {
50
+ return cached;
51
+ }
52
+ const format = zodTextFormat(zodObject, name);
53
+ zodTextFormatCache.set(zodObject, format);
54
+ return format;
55
+ }
56
+ function zodTextFormat(zodObject, name) {
57
+ const rawSchema = z.toJSONSchema(zodObject, { target: 'draft-7' });
58
+ const sanitizedSchema = sanitizeSchemaForOpenAI(rawSchema);
59
+ return {
60
+ type: 'json_schema',
61
+ name,
62
+ strict: true,
63
+ schema: sanitizedSchema,
64
+ $brand: 'auto-parseable-response-format',
65
+ $parseRaw: (content) => {
66
+ try {
67
+ return zodObject.parse(JSON.parse(content));
68
+ }
69
+ catch (error) {
70
+ return new ZodValidationError(error instanceof Error ? error.message : String(error));
71
+ }
72
+ },
73
+ __output: undefined,
74
+ };
75
+ }
76
+ /**
77
+ * OpenAI LLM provider.
78
+ */
79
+ export class OpenAIProvider {
80
+ name = 'openai';
81
+ client;
82
+ constructor(apiKey) {
83
+ const fetchOptions = {};
84
+ const abortSignal = dntShim.dntGlobalThis.abortSignal;
85
+ if (abortSignal) {
86
+ fetchOptions.signal = abortSignal;
87
+ }
88
+ this.client = new OpenAI({
89
+ apiKey: apiKey ?? dntShim.Deno.env.get('OPENAI_API_KEY'),
90
+ fetchOptions,
91
+ });
92
+ }
93
+ async complete(messages, model, schema, params) {
94
+ try {
95
+ const response = await this.client.responses.parse({
96
+ ...params,
97
+ model,
98
+ input: messages.map((m) => ({
99
+ role: m.role,
100
+ content: m.content,
101
+ })),
102
+ ...(schema != null
103
+ ? {
104
+ text: {
105
+ format: getCachedZodTextFormat(schema, 'response'),
106
+ },
107
+ }
108
+ : {}),
109
+ });
110
+ const usage = response.usage
111
+ ? {
112
+ inputTokens: response.usage.input_tokens,
113
+ outputTokens: response.usage.output_tokens,
114
+ totalTokens: response.usage.total_tokens,
115
+ }
116
+ : null;
117
+ if (response.output_parsed instanceof Error) {
118
+ return {
119
+ parsed: null,
120
+ text: response.output_text,
121
+ usage,
122
+ error: response.output_parsed,
123
+ };
124
+ }
125
+ return {
126
+ parsed: schema != null ? response.output_parsed : response.output_text,
127
+ text: response.output_text,
128
+ usage,
129
+ error: null,
130
+ };
131
+ }
132
+ catch (error) {
133
+ return {
134
+ parsed: null,
135
+ text: null,
136
+ usage: null,
137
+ error: error instanceof Error ? error : new Error(String(error)),
138
+ };
139
+ }
140
+ }
141
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Model pricing lookup and cost calculation.
3
+ *
4
+ * Pricing data is bundled from models.dev at build time.
5
+ * Run `deno task update-models` to refresh the data.
6
+ */
7
+ import type { TokenUsage, UsageCost } from '../response.js';
8
+ /**
9
+ * Pricing information for a model (USD per 1M tokens).
10
+ */
11
+ export interface ModelPricing {
12
+ input: number;
13
+ output: number;
14
+ cacheRead?: number;
15
+ cacheWrite?: number;
16
+ reasoning?: number;
17
+ }
18
+ /**
19
+ * Model information including pricing and limits.
20
+ */
21
+ export interface ModelInfo {
22
+ id: string;
23
+ name: string;
24
+ provider: string;
25
+ pricing: ModelPricing | null;
26
+ contextLimit: number | null;
27
+ outputLimit: number | null;
28
+ capabilities: {
29
+ structuredOutput: boolean;
30
+ toolCall: boolean;
31
+ reasoning: boolean;
32
+ };
33
+ }
34
+ interface ModelEntry {
35
+ id: string;
36
+ name: string;
37
+ cost?: {
38
+ input?: number;
39
+ output?: number;
40
+ cache_read?: number;
41
+ cache_write?: number;
42
+ reasoning?: number;
43
+ };
44
+ limit?: {
45
+ context?: number;
46
+ output?: number;
47
+ };
48
+ structured_output?: boolean;
49
+ tool_call?: boolean;
50
+ reasoning?: boolean;
51
+ }
52
+ /**
53
+ * Look up a model entry by ID (with normalization fallback).
54
+ */
55
+ export declare function lookupModel(modelId: string): {
56
+ provider: string;
57
+ model: ModelEntry;
58
+ } | null;
59
+ /**
60
+ * Get pricing information for a model.
61
+ */
62
+ export declare function getModelPricing(modelId: string): ModelPricing | null;
63
+ /**
64
+ * Get full model information including pricing and capabilities.
65
+ */
66
+ export declare function getModelInfo(modelId: string): ModelInfo | null;
67
+ /**
68
+ * Calculate cost for token usage.
69
+ */
70
+ export declare function calculateCost(modelId: string, usage: TokenUsage): UsageCost | null;
71
+ export {};
72
+ //# sourceMappingURL=pricing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../../src/src/providers/pricing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE;QACb,gBAAgB,EAAE,OAAO,CAAC;QAC1B,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;KACnB,CAAC;CACF;AAGD,UAAU,UAAU;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AA4BD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAE3F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAoBpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAsB9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAgBlF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Model pricing lookup and cost calculation.
3
+ *
4
+ * Pricing data is bundled from models.dev at build time.
5
+ * Run `deno task update-models` to refresh the data.
6
+ */
7
+ import modelsData from '../assets/models.js';
8
+ // Build flat index: model ID -> { provider, model }
9
+ const modelIndex = new Map();
10
+ for (const [providerId, provider] of Object.entries(modelsData)) {
11
+ if (!provider.models)
12
+ continue;
13
+ for (const [modelId, model] of Object.entries(provider.models)) {
14
+ modelIndex.set(modelId, { provider: providerId, model });
15
+ }
16
+ }
17
+ /**
18
+ * Normalize a model ID by removing date suffixes and common variations.
19
+ */
20
+ function normalizeModel(modelId) {
21
+ return modelId.replace(/-\d{4}-\d{2}-\d{2}$/, '');
22
+ }
23
+ /**
24
+ * Look up a model entry by ID (with normalization fallback).
25
+ */
26
+ export function lookupModel(modelId) {
27
+ return modelIndex.get(modelId) ?? modelIndex.get(normalizeModel(modelId)) ?? null;
28
+ }
29
+ /**
30
+ * Get pricing information for a model.
31
+ */
32
+ export function getModelPricing(modelId) {
33
+ const entry = lookupModel(modelId);
34
+ if (!entry?.model.cost) {
35
+ return null;
36
+ }
37
+ const cost = entry.model.cost;
38
+ if (cost.input === 0 && cost.output === 0) {
39
+ return null;
40
+ }
41
+ return {
42
+ input: cost.input ?? 0,
43
+ output: cost.output ?? 0,
44
+ cacheRead: cost.cache_read,
45
+ cacheWrite: cost.cache_write,
46
+ reasoning: cost.reasoning,
47
+ };
48
+ }
49
+ /**
50
+ * Get full model information including pricing and capabilities.
51
+ */
52
+ export function getModelInfo(modelId) {
53
+ const entry = lookupModel(modelId);
54
+ if (!entry) {
55
+ return null;
56
+ }
57
+ const { provider, model: m } = entry;
58
+ return {
59
+ id: m.id,
60
+ name: m.name,
61
+ provider,
62
+ pricing: getModelPricing(modelId),
63
+ contextLimit: m.limit?.context ?? null,
64
+ outputLimit: m.limit?.output ?? null,
65
+ capabilities: {
66
+ structuredOutput: m.structured_output ?? false,
67
+ toolCall: m.tool_call ?? false,
68
+ reasoning: m.reasoning ?? false,
69
+ },
70
+ };
71
+ }
72
+ /**
73
+ * Calculate cost for token usage.
74
+ */
75
+ export function calculateCost(modelId, usage) {
76
+ const pricing = getModelPricing(modelId);
77
+ if (!pricing) {
78
+ return null;
79
+ }
80
+ const inputCost = (usage.inputTokens / 1_000_000) * pricing.input;
81
+ const outputCost = (usage.outputTokens / 1_000_000) * pricing.output;
82
+ return {
83
+ inputCost,
84
+ outputCost,
85
+ totalCost: inputCost + outputCost,
86
+ currency: 'USD',
87
+ };
88
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Provider registry - instantiates LLM providers by name or model ID.
3
+ */
4
+ import type { LLMProvider } from './types.js';
5
+ /**
6
+ * Get a provider by name.
7
+ * Creates a fresh provider instance each time to support different API keys.
8
+ * @param name - Provider name ('openai', 'google')
9
+ * @param apiKey - Optional API key. If not provided, uses environment variable.
10
+ */
11
+ export declare function getProvider(name: string, apiKey?: string): LLMProvider;
12
+ /**
13
+ * Get the appropriate provider for a model ID.
14
+ * Infers provider from model name prefix.
15
+ * Creates a fresh provider instance each time to support different API keys.
16
+ * @param modelId - Model identifier (e.g., 'gpt-4.1', 'gemini-2.0-flash')
17
+ * @param apiKey - Optional API key. If not provided, uses environment variable.
18
+ */
19
+ export declare function getProviderForModel(modelId: string, apiKey?: string): LLMProvider;
20
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/providers/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAQtE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CASjF"}