@far-world-labs/verblets 0.2.0 → 0.3.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 (330) hide show
  1. package/README.md +86 -213
  2. package/dist/index.browser.js +74 -0
  3. package/dist/index.js +548 -0
  4. package/dist/shared-C6kPWghF.js +7806 -0
  5. package/package.json +32 -11
  6. package/.cursor/launch.json +0 -30
  7. package/.cursor/settings.json +0 -20
  8. package/.github/workflows/branch-protection.yml +0 -22
  9. package/.github/workflows/ci.yml +0 -165
  10. package/.husky/pre-commit +0 -4
  11. package/.prettierrc +0 -6
  12. package/.release-it.json +0 -12
  13. package/.vitest.config.examples.js +0 -12
  14. package/.vitest.config.js +0 -8
  15. package/.vscode/launch.json +0 -31
  16. package/AGENTS.md +0 -220
  17. package/DEVELOPING.md +0 -105
  18. package/docker-compose.yml +0 -7
  19. package/eslint.config.js +0 -80
  20. package/scripts/clear-redis.js +0 -74
  21. package/scripts/generate-chain/index.js +0 -111
  22. package/scripts/generate-lib/index.js +0 -68
  23. package/scripts/generate-test/index.js +0 -137
  24. package/scripts/generate-verblet/README.md +0 -17
  25. package/scripts/generate-verblet/index.js +0 -110
  26. package/scripts/run.sh +0 -15
  27. package/scripts/runner/index.js +0 -56
  28. package/scripts/simple-editor/README.md +0 -34
  29. package/scripts/simple-editor/index.js +0 -79
  30. package/scripts/summarize-files/index.js +0 -70
  31. package/src/chains/README.md +0 -30
  32. package/src/chains/anonymize/README.md +0 -21
  33. package/src/chains/anonymize/index.examples.js +0 -75
  34. package/src/chains/anonymize/index.js +0 -121
  35. package/src/chains/anonymize/index.spec.js +0 -78
  36. package/src/chains/bulk-central-tendency/index.examples.js +0 -138
  37. package/src/chains/bulk-central-tendency/index.js +0 -91
  38. package/src/chains/bulk-filter/README.md +0 -21
  39. package/src/chains/bulk-filter/index.examples.js +0 -22
  40. package/src/chains/bulk-filter/index.js +0 -58
  41. package/src/chains/bulk-filter/index.spec.js +0 -38
  42. package/src/chains/bulk-find/README.md +0 -16
  43. package/src/chains/bulk-find/index.examples.js +0 -20
  44. package/src/chains/bulk-find/index.js +0 -30
  45. package/src/chains/bulk-find/index.spec.js +0 -26
  46. package/src/chains/bulk-group/README.md +0 -23
  47. package/src/chains/bulk-group/index.examples.js +0 -18
  48. package/src/chains/bulk-group/index.js +0 -34
  49. package/src/chains/bulk-group/index.spec.js +0 -41
  50. package/src/chains/bulk-map/README.md +0 -43
  51. package/src/chains/bulk-map/index.examples.js +0 -17
  52. package/src/chains/bulk-map/index.js +0 -86
  53. package/src/chains/bulk-map/index.spec.js +0 -44
  54. package/src/chains/bulk-reduce/README.md +0 -12
  55. package/src/chains/bulk-reduce/index.examples.js +0 -15
  56. package/src/chains/bulk-reduce/index.js +0 -13
  57. package/src/chains/bulk-reduce/index.spec.js +0 -25
  58. package/src/chains/bulk-score/README.md +0 -16
  59. package/src/chains/bulk-score/bulk-score-result.json +0 -18
  60. package/src/chains/bulk-score/index.examples.js +0 -22
  61. package/src/chains/bulk-score/index.js +0 -133
  62. package/src/chains/bulk-score/index.spec.js +0 -30
  63. package/src/chains/category-samples/README.md +0 -61
  64. package/src/chains/category-samples/index.examples.js +0 -103
  65. package/src/chains/category-samples/index.js +0 -134
  66. package/src/chains/collect-terms/README.md +0 -12
  67. package/src/chains/collect-terms/index.examples.js +0 -16
  68. package/src/chains/collect-terms/index.js +0 -44
  69. package/src/chains/collect-terms/index.spec.js +0 -25
  70. package/src/chains/conversation/README.md +0 -26
  71. package/src/chains/conversation/index.examples.js +0 -398
  72. package/src/chains/conversation/index.js +0 -126
  73. package/src/chains/conversation/index.spec.js +0 -148
  74. package/src/chains/conversation/turn-policies.js +0 -93
  75. package/src/chains/conversation/turn-policies.md +0 -123
  76. package/src/chains/conversation/turn-policies.spec.js +0 -135
  77. package/src/chains/date/README.md +0 -12
  78. package/src/chains/date/index.examples.js +0 -47
  79. package/src/chains/date/index.js +0 -74
  80. package/src/chains/date/index.spec.js +0 -62
  81. package/src/chains/disambiguate/README.md +0 -22
  82. package/src/chains/disambiguate/disambiguate-meanings-result.json +0 -16
  83. package/src/chains/disambiguate/index.examples.js +0 -18
  84. package/src/chains/disambiguate/index.js +0 -92
  85. package/src/chains/disambiguate/index.spec.js +0 -25
  86. package/src/chains/dismantle/README.md +0 -67
  87. package/src/chains/dismantle/dismantle.examples.js +0 -27
  88. package/src/chains/dismantle/index.examples.js +0 -30
  89. package/src/chains/dismantle/index.js +0 -303
  90. package/src/chains/dismantle/index.spec.js +0 -32
  91. package/src/chains/expect/README.md +0 -171
  92. package/src/chains/expect/index.examples.js +0 -146
  93. package/src/chains/expect/index.js +0 -207
  94. package/src/chains/expect/index.spec.js +0 -324
  95. package/src/chains/filter-ambiguous/README.md +0 -11
  96. package/src/chains/filter-ambiguous/index.examples.js +0 -20
  97. package/src/chains/filter-ambiguous/index.js +0 -49
  98. package/src/chains/filter-ambiguous/index.spec.js +0 -31
  99. package/src/chains/glossary/README.md +0 -19
  100. package/src/chains/glossary/index.examples.js +0 -386
  101. package/src/chains/glossary/index.js +0 -75
  102. package/src/chains/glossary/index.spec.js +0 -19
  103. package/src/chains/intersections/README.md +0 -166
  104. package/src/chains/intersections/index.examples.js +0 -280
  105. package/src/chains/intersections/index.js +0 -218
  106. package/src/chains/intersections/intersection-result.json +0 -38
  107. package/src/chains/list/index.examples.js +0 -68
  108. package/src/chains/list/index.js +0 -214
  109. package/src/chains/list/index.spec.js +0 -67
  110. package/src/chains/list/list-result.json +0 -16
  111. package/src/chains/list/schema.json +0 -24
  112. package/src/chains/llm-logger/README.md +0 -366
  113. package/src/chains/llm-logger/index.js +0 -591
  114. package/src/chains/llm-logger/index.spec.js +0 -391
  115. package/src/chains/llm-logger/schema.json +0 -105
  116. package/src/chains/questions/index.examples.js +0 -69
  117. package/src/chains/questions/index.js +0 -135
  118. package/src/chains/questions/index.spec.js +0 -29
  119. package/src/chains/scan-js/index.js +0 -116
  120. package/src/chains/set-interval/README.md +0 -81
  121. package/src/chains/set-interval/index.examples.js +0 -64
  122. package/src/chains/set-interval/index.js +0 -152
  123. package/src/chains/set-interval/index.spec.js +0 -70
  124. package/src/chains/socratic/README.md +0 -17
  125. package/src/chains/socratic/index.js +0 -64
  126. package/src/chains/socratic/index.spec.js +0 -24
  127. package/src/chains/sort/index.examples.js +0 -36
  128. package/src/chains/sort/index.js +0 -163
  129. package/src/chains/sort/index.spec.js +0 -112
  130. package/src/chains/sort/sort-result.json +0 -16
  131. package/src/chains/summary-map/README.md +0 -41
  132. package/src/chains/summary-map/index.examples.js +0 -64
  133. package/src/chains/summary-map/index.js +0 -226
  134. package/src/chains/summary-map/index.spec.js +0 -153
  135. package/src/chains/test/index.js +0 -114
  136. package/src/chains/test-advice/index.js +0 -35
  137. package/src/chains/themes/README.md +0 -20
  138. package/src/chains/themes/index.examples.js +0 -17
  139. package/src/chains/themes/index.js +0 -28
  140. package/src/chains/themes/index.spec.js +0 -19
  141. package/src/chains/veiled-variants/index.examples.js +0 -18
  142. package/src/chains/veiled-variants/index.js +0 -107
  143. package/src/chains/veiled-variants/index.spec.js +0 -40
  144. package/src/constants/common.js +0 -13
  145. package/src/constants/messages.js +0 -3
  146. package/src/constants/models.js +0 -184
  147. package/src/index.js +0 -203
  148. package/src/json-schemas/README.md +0 -13
  149. package/src/json-schemas/cars-test.json +0 -11
  150. package/src/json-schemas/index.js +0 -12
  151. package/src/json-schemas/intent.json +0 -38
  152. package/src/json-schemas/schema-dot-org-photograph.json +0 -133
  153. package/src/json-schemas/schema-dot-org-place.json +0 -129
  154. package/src/lib/README.md +0 -26
  155. package/src/lib/any-signal/index.js +0 -28
  156. package/src/lib/assert/README.md +0 -84
  157. package/src/lib/assert/index.js +0 -50
  158. package/src/lib/bulk-filter/README.md +0 -22
  159. package/src/lib/bulk-filter/index.examples.js +0 -27
  160. package/src/lib/bulk-filter/index.js +0 -63
  161. package/src/lib/bulk-filter/index.spec.js +0 -38
  162. package/src/lib/bulk-find/README.md +0 -18
  163. package/src/lib/bulk-find/index.examples.js +0 -19
  164. package/src/lib/bulk-find/index.js +0 -30
  165. package/src/lib/bulk-find/index.spec.js +0 -41
  166. package/src/lib/chatgpt/index.js +0 -163
  167. package/src/lib/combinations/index.js +0 -30
  168. package/src/lib/combinations/index.spec.js +0 -23
  169. package/src/lib/editor/index.js +0 -31
  170. package/src/lib/functional/index.js +0 -28
  171. package/src/lib/logger-service/index.js +0 -32
  172. package/src/lib/parse-js-parts/index.js +0 -321
  173. package/src/lib/parse-js-parts/index.spec.js +0 -156
  174. package/src/lib/parse-llm-list/README.md +0 -39
  175. package/src/lib/parse-llm-list/index.js +0 -54
  176. package/src/lib/parse-llm-list/index.spec.js +0 -59
  177. package/src/lib/path-aliases/index.js +0 -37
  178. package/src/lib/path-aliases/index.spec.js +0 -64
  179. package/src/lib/pave/index.js +0 -34
  180. package/src/lib/pave/index.spec.js +0 -76
  181. package/src/lib/prompt-cache/index.js +0 -50
  182. package/src/lib/retry/index.js +0 -66
  183. package/src/lib/retry/index.spec.js +0 -86
  184. package/src/lib/ring-buffer/README.md +0 -82
  185. package/src/lib/ring-buffer/index.js +0 -235
  186. package/src/lib/ring-buffer/index.spec.js +0 -388
  187. package/src/lib/search-best-first/city-walk.spec.js +0 -37
  188. package/src/lib/search-best-first/index.js +0 -97
  189. package/src/lib/search-best-first/index.spec.js +0 -35
  190. package/src/lib/search-js-files/code-features-property-definitions.json +0 -123
  191. package/src/lib/search-js-files/index.examples.js +0 -22
  192. package/src/lib/search-js-files/index.js +0 -155
  193. package/src/lib/search-js-files/index.spec.js +0 -34
  194. package/src/lib/search-js-files/scan-file.js +0 -242
  195. package/src/lib/shorten-text/index.js +0 -25
  196. package/src/lib/shorten-text/index.spec.js +0 -68
  197. package/src/lib/strip-numeric/index.js +0 -5
  198. package/src/lib/strip-response/index.js +0 -30
  199. package/src/lib/template-replace/index.js +0 -23
  200. package/src/lib/template-replace/index.spec.js +0 -60
  201. package/src/lib/timed-abort-controller/index.js +0 -41
  202. package/src/lib/to-bool/index.js +0 -8
  203. package/src/lib/to-date/index.js +0 -11
  204. package/src/lib/to-enum/index.js +0 -14
  205. package/src/lib/to-number/index.js +0 -12
  206. package/src/lib/to-number-with-units/index.js +0 -51
  207. package/src/lib/transcribe/index.js +0 -78
  208. package/src/prompts/README.md +0 -17
  209. package/src/prompts/as-enum.js +0 -5
  210. package/src/prompts/as-json-schema.js +0 -9
  211. package/src/prompts/as-object-with-schema.js +0 -26
  212. package/src/prompts/as-schema-org-text.js +0 -25
  213. package/src/prompts/as-schema-org-type.js +0 -1
  214. package/src/prompts/blog-post.js +0 -7
  215. package/src/prompts/code-features.js +0 -24
  216. package/src/prompts/constants.js +0 -101
  217. package/src/prompts/features-json-schema.js +0 -27
  218. package/src/prompts/generate-collection.js +0 -26
  219. package/src/prompts/generate-list.js +0 -48
  220. package/src/prompts/generate-questions.js +0 -19
  221. package/src/prompts/index.js +0 -20
  222. package/src/prompts/intent.js +0 -60
  223. package/src/prompts/output-succinct-names.js +0 -3
  224. package/src/prompts/select-from-threshold.js +0 -17
  225. package/src/prompts/sort.js +0 -31
  226. package/src/prompts/style.js +0 -38
  227. package/src/prompts/summarize.js +0 -13
  228. package/src/prompts/token-budget.js +0 -3
  229. package/src/prompts/wrap-list.js +0 -11
  230. package/src/prompts/wrap-variable.js +0 -36
  231. package/src/services/llm-model/global-overrides.spec.js +0 -432
  232. package/src/services/llm-model/index.js +0 -308
  233. package/src/services/llm-model/model.js +0 -21
  234. package/src/services/llm-model/negotiate.spec.js +0 -447
  235. package/src/services/redis/index.js +0 -147
  236. package/src/test/setup.js +0 -20
  237. package/src/verblets/README.md +0 -26
  238. package/src/verblets/auto/index.examples.js +0 -31
  239. package/src/verblets/auto/index.js +0 -28
  240. package/src/verblets/auto/index.spec.js +0 -32
  241. package/src/verblets/bool/README.md +0 -36
  242. package/src/verblets/bool/index.examples.js +0 -80
  243. package/src/verblets/bool/index.js +0 -25
  244. package/src/verblets/bool/index.schema.json +0 -14
  245. package/src/verblets/bool/index.spec.js +0 -33
  246. package/src/verblets/central-tendency/README.md +0 -166
  247. package/src/verblets/central-tendency/central-tendency-result.json +0 -24
  248. package/src/verblets/central-tendency/index.examples.js +0 -196
  249. package/src/verblets/central-tendency/index.js +0 -171
  250. package/src/verblets/central-tendency/index.spec.js +0 -148
  251. package/src/verblets/conversation-turn/README.md +0 -33
  252. package/src/verblets/conversation-turn/index.examples.js +0 -218
  253. package/src/verblets/conversation-turn/index.js +0 -68
  254. package/src/verblets/conversation-turn/index.spec.js +0 -77
  255. package/src/verblets/conversation-turn-multi/README.md +0 -31
  256. package/src/verblets/conversation-turn-multi/index.examples.js +0 -160
  257. package/src/verblets/conversation-turn-multi/index.js +0 -104
  258. package/src/verblets/conversation-turn-multi/index.spec.js +0 -63
  259. package/src/verblets/enum/index.examples.js +0 -30
  260. package/src/verblets/enum/index.js +0 -18
  261. package/src/verblets/enum/index.spec.js +0 -35
  262. package/src/verblets/expect/README.md +0 -64
  263. package/src/verblets/expect/index.examples.js +0 -109
  264. package/src/verblets/expect/index.js +0 -75
  265. package/src/verblets/expect/index.spec.js +0 -127
  266. package/src/verblets/intent/index.examples.js +0 -139
  267. package/src/verblets/intent/index.js +0 -60
  268. package/src/verblets/intent/index.spec.js +0 -31
  269. package/src/verblets/intersection/README.md +0 -16
  270. package/src/verblets/intersection/index.examples.js +0 -89
  271. package/src/verblets/intersection/index.js +0 -125
  272. package/src/verblets/intersection/index.spec.js +0 -60
  273. package/src/verblets/intersection/intersection-result.json +0 -16
  274. package/src/verblets/list-expand/README.md +0 -10
  275. package/src/verblets/list-expand/index.examples.js +0 -14
  276. package/src/verblets/list-expand/index.js +0 -104
  277. package/src/verblets/list-expand/index.spec.js +0 -18
  278. package/src/verblets/list-expand/list-expand-result.json +0 -16
  279. package/src/verblets/list-filter/README.md +0 -22
  280. package/src/verblets/list-filter/index.examples.js +0 -26
  281. package/src/verblets/list-filter/index.js +0 -18
  282. package/src/verblets/list-filter/index.spec.js +0 -19
  283. package/src/verblets/list-find/README.md +0 -11
  284. package/src/verblets/list-find/index.examples.js +0 -15
  285. package/src/verblets/list-find/index.js +0 -17
  286. package/src/verblets/list-find/index.spec.js +0 -19
  287. package/src/verblets/list-group/README.md +0 -16
  288. package/src/verblets/list-group/index.examples.js +0 -16
  289. package/src/verblets/list-group/index.js +0 -112
  290. package/src/verblets/list-group/index.spec.js +0 -35
  291. package/src/verblets/list-group/list-group-result.json +0 -16
  292. package/src/verblets/list-map/README.md +0 -11
  293. package/src/verblets/list-map/index.examples.js +0 -15
  294. package/src/verblets/list-map/index.js +0 -26
  295. package/src/verblets/list-map/index.spec.js +0 -17
  296. package/src/verblets/list-reduce/README.md +0 -10
  297. package/src/verblets/list-reduce/index.examples.js +0 -14
  298. package/src/verblets/list-reduce/index.js +0 -21
  299. package/src/verblets/list-reduce/index.spec.js +0 -27
  300. package/src/verblets/list-reduce/index.spec.jsx +0 -27
  301. package/src/verblets/name/README.md +0 -15
  302. package/src/verblets/name/index.examples.js +0 -28
  303. package/src/verblets/name/index.js +0 -19
  304. package/src/verblets/name/index.spec.js +0 -33
  305. package/src/verblets/name-similar-to/README.md +0 -26
  306. package/src/verblets/name-similar-to/index.examples.js +0 -18
  307. package/src/verblets/name-similar-to/index.js +0 -20
  308. package/src/verblets/name-similar-to/index.spec.js +0 -13
  309. package/src/verblets/number/index.examples.js +0 -199
  310. package/src/verblets/number/index.js +0 -25
  311. package/src/verblets/number/index.spec.js +0 -33
  312. package/src/verblets/number-with-units/index.examples.js +0 -38
  313. package/src/verblets/number-with-units/index.js +0 -84
  314. package/src/verblets/number-with-units/index.spec.js +0 -46
  315. package/src/verblets/number-with-units/number-with-units-result.json +0 -23
  316. package/src/verblets/people-list/README.md +0 -28
  317. package/src/verblets/people-list/index.examples.js +0 -184
  318. package/src/verblets/people-list/index.js +0 -44
  319. package/src/verblets/people-list/index.spec.js +0 -49
  320. package/src/verblets/schema-org/index.examples.js +0 -51
  321. package/src/verblets/schema-org/index.js +0 -37
  322. package/src/verblets/schema-org/index.spec.js +0 -39
  323. package/src/verblets/sentiment/README.md +0 -10
  324. package/src/verblets/sentiment/index.examples.js +0 -20
  325. package/src/verblets/sentiment/index.js +0 -9
  326. package/src/verblets/sentiment/index.spec.js +0 -20
  327. package/src/verblets/to-object/README.md +0 -38
  328. package/src/verblets/to-object/index.examples.js +0 -29
  329. package/src/verblets/to-object/index.js +0 -131
  330. package/src/verblets/to-object/index.spec.js +0 -71
@@ -1,308 +0,0 @@
1
- import * as tokenizer from 'gpt-tokenizer';
2
-
3
- import Model from './model.js';
4
- import {
5
- frequencyPenalty as frequencyPenaltyConfig,
6
- models,
7
- presencePenalty as presencePenaltyConfig,
8
- temperature as temperatureConfig,
9
- topP as topPConfig,
10
- } from '../../constants/models.js';
11
-
12
- // Prioritized list of models (best to worst, excluding privacy/reasoning which are never auto-invoked)
13
- const prioritizedModels = [
14
- 'fastGoodCheap',
15
- 'fastGoodCheapMulti',
16
- 'fastGood',
17
- 'fastGoodMulti',
18
- 'goodCheap',
19
- 'goodCheapMulti',
20
- 'good',
21
- 'goodMulti',
22
- 'fastCheap',
23
- 'fastCheapMulti',
24
- 'fast',
25
- 'fastMulti',
26
- 'cheap',
27
- 'cheapMulti',
28
- 'multi',
29
- 'fastCheapReasoning',
30
- 'fastCheapReasoningMulti',
31
- 'fastReasoning',
32
- 'fastReasoningMulti',
33
- 'cheapReasoning',
34
- 'cheapReasoningMulti',
35
- 'reasoning',
36
- 'reasoningMulti',
37
- ];
38
-
39
- class ModelService {
40
- constructor() {
41
- this.models = {};
42
- this.models = Object.entries(models).reduce(
43
- (acc, [key, modelDef]) => ({
44
- ...acc,
45
- [key]: new Model({
46
- ...modelDef,
47
- key,
48
- tokenizer: tokenizer.encode,
49
- }),
50
- }),
51
- {}
52
- );
53
-
54
- // Always default to fastGood for public model
55
- this.bestPublicModelKey = 'fastGood';
56
-
57
- // Global overrides
58
- this.globalOverrides = {
59
- modelName: null, // Force specific model
60
- negotiate: null, // Force specific negotiation options
61
- temperature: null, // Force specific temperature
62
- maxTokens: null, // Force specific max tokens
63
- topP: null, // Force specific top_p
64
- frequencyPenalty: null, // Force specific frequency penalty
65
- presencePenalty: null, // Force specific presence penalty
66
- };
67
- }
68
-
69
- // Global override management
70
- setGlobalOverride(key, value) {
71
- if (!(key in this.globalOverrides)) {
72
- throw new Error(
73
- `Invalid override key: ${key}. Valid keys are: ${Object.keys(this.globalOverrides).join(
74
- ', '
75
- )}`
76
- );
77
- }
78
- this.globalOverrides[key] = value;
79
- }
80
-
81
- clearGlobalOverride(key) {
82
- if (key) {
83
- if (!(key in this.globalOverrides)) {
84
- throw new Error(
85
- `Invalid override key: ${key}. Valid keys are: ${Object.keys(this.globalOverrides).join(
86
- ', '
87
- )}`
88
- );
89
- }
90
- this.globalOverrides[key] = null;
91
- } else {
92
- // Clear all overrides
93
- Object.keys(this.globalOverrides).forEach((k) => {
94
- this.globalOverrides[k] = null;
95
- });
96
- }
97
- }
98
-
99
- getGlobalOverride(key) {
100
- return this.globalOverrides[key];
101
- }
102
-
103
- getAllGlobalOverrides() {
104
- return { ...this.globalOverrides };
105
- }
106
-
107
- // Apply global overrides to model options
108
- applyGlobalOverrides(modelOptions) {
109
- const result = { ...modelOptions };
110
-
111
- // Apply each override if it's set (not null)
112
- Object.entries(this.globalOverrides).forEach(([key, value]) => {
113
- if (value !== null) {
114
- result[key] = value;
115
- }
116
- });
117
-
118
- return result;
119
- }
120
-
121
- getBestPublicModel() {
122
- return this.models[this.bestPublicModelKey];
123
- }
124
-
125
- getBestPrivateModel() {
126
- if (!this.models.privacy) {
127
- throw new Error(
128
- 'No privacy model configured. Configure a privacy model or use a public model instead.'
129
- );
130
- }
131
- return this.models.privacy;
132
- }
133
-
134
- updateBestPublicModel(name) {
135
- this.bestPublicModelKey = name;
136
- }
137
-
138
- getModel(name) {
139
- if (!name) {
140
- return this.getBestPublicModel();
141
- }
142
-
143
- // First try to find by key
144
- let modelFound = this.models[name];
145
-
146
- // If not found by key, try to find by model name
147
- if (!modelFound) {
148
- modelFound = Object.values(this.models).find((model) => model.name === name);
149
- }
150
-
151
- if (!modelFound) {
152
- throw new Error(`Get model by name [error]: '${name}' not found.`);
153
- }
154
- return modelFound;
155
- }
156
-
157
- negotiateModel(preferred, negotiation = {}) {
158
- const { privacy, reasoning, fast, cheap, good, multi } = negotiation;
159
-
160
- // Privacy models take absolute priority
161
- if (privacy) {
162
- if (!this.models.privacy) {
163
- return undefined;
164
- }
165
- return 'privacy';
166
- }
167
-
168
- // Helper function to check if a model matches all requirements
169
- const matchesRequirements = (modelKey) => {
170
- if (!this.models[modelKey]) {
171
- return false;
172
- }
173
-
174
- const lowerModelKey = modelKey.toLowerCase();
175
-
176
- // Check each requirement - support both positive and negative (false) requirements
177
- // Only check requirements that are explicitly specified (not undefined)
178
- if (fast === true && !/fast/i.test(lowerModelKey)) {
179
- return false;
180
- }
181
- if (fast === false && /fast/i.test(lowerModelKey)) {
182
- return false;
183
- }
184
- if (cheap === true && !/cheap/i.test(lowerModelKey)) {
185
- return false;
186
- }
187
- if (cheap === false && /cheap/i.test(lowerModelKey)) {
188
- return false;
189
- }
190
- if (good === true && !/good/i.test(lowerModelKey)) {
191
- return false;
192
- }
193
- if (good === false && /good/i.test(lowerModelKey)) {
194
- return false;
195
- }
196
- if (reasoning === true && !/reasoning/i.test(lowerModelKey)) {
197
- return false;
198
- }
199
- if (reasoning === false && /reasoning/i.test(lowerModelKey)) {
200
- return false;
201
- }
202
- if (multi === true && !/multi/i.test(lowerModelKey)) {
203
- return false;
204
- }
205
- if (multi === false && /multi/i.test(lowerModelKey)) {
206
- return false;
207
- }
208
- return true;
209
- };
210
-
211
- // Check if any specific requirements are given
212
- const hasSpecificRequirements =
213
- fast !== undefined ||
214
- cheap !== undefined ||
215
- good !== undefined ||
216
- reasoning !== undefined ||
217
- multi !== undefined;
218
-
219
- // If no specific requirements are given, return preferred model if available
220
- if (!hasSpecificRequirements) {
221
- if (preferred && this.models[preferred]) {
222
- return preferred;
223
- }
224
- return this.bestPublicModelKey;
225
- }
226
-
227
- // Find the first model that matches all requirements
228
- for (const modelKey of prioritizedModels) {
229
- if (matchesRequirements(modelKey)) {
230
- return modelKey;
231
- }
232
- }
233
-
234
- // Check if specific critical requirements were requested but couldn't be satisfied
235
- if (reasoning === true) {
236
- return undefined;
237
- }
238
-
239
- // If specific requirements were given but couldn't be satisfied, return undefined
240
- return undefined;
241
- }
242
-
243
- getRequestParameters(options = {}) {
244
- const frequencyPenalty = options.frequencyPenalty ?? frequencyPenaltyConfig;
245
- const presencePenalty = options.presencePenalty ?? presencePenaltyConfig;
246
- const temperature = options.temperature ?? temperatureConfig;
247
- const topP = options.topP ?? topPConfig;
248
- const { maxTokens, modelName, prompt } = options;
249
-
250
- const modelFound = this.getModel(modelName);
251
-
252
- let maxTokensFound = maxTokens;
253
- if (!maxTokens) {
254
- const promptTokens = modelFound.toTokens(prompt).length;
255
- const availableTokens = modelFound.maxContextWindow - promptTokens;
256
- // Cap to the model's maximum output tokens
257
- maxTokensFound = Math.min(availableTokens, modelFound.maxOutputTokens);
258
- }
259
-
260
- return {
261
- model: modelFound.name,
262
- temperature,
263
- max_tokens: maxTokensFound,
264
- top_p: topP,
265
- frequency_penalty: frequencyPenalty,
266
- presence_penalty: presencePenalty,
267
- };
268
- }
269
-
270
- getRequestConfig(options) {
271
- const { tools, toolChoice, modelName, prompt, systemPrompt, response_format } = options;
272
-
273
- const modelFound = this.getModel(modelName);
274
-
275
- let requestPrompt = { prompt };
276
- if (/chat/.test(modelFound.endpoint)) {
277
- const userMessage = { role: 'user', content: prompt };
278
- const systemMessages = systemPrompt
279
- ? [
280
- {
281
- role: 'system',
282
- content: systemPrompt,
283
- },
284
- ]
285
- : [];
286
- requestPrompt = {
287
- messages: [...systemMessages, userMessage],
288
- tools,
289
- tool_choice: tools && !toolChoice ? 'auto' : toolChoice,
290
- };
291
- }
292
- const data = this.getRequestParameters(options);
293
-
294
- const result = {
295
- ...requestPrompt,
296
- ...data,
297
- };
298
-
299
- // Add response_format if provided
300
- if (response_format) {
301
- result.response_format = response_format;
302
- }
303
-
304
- return result;
305
- }
306
- }
307
-
308
- export default new ModelService();
@@ -1,21 +0,0 @@
1
- export default class Model {
2
- constructor(options) {
3
- Object.assign(this, options);
4
- }
5
-
6
- toTokens(text) {
7
- return this.tokenizer(text);
8
- }
9
-
10
- budgetTokens(text, { completionMax = Infinity } = {}) {
11
- const prompt = this.toTokens(text).length;
12
- const total = this.maxContextWindow;
13
- const completion = Math.min(Math.min(total - prompt, this.maxOutputTokens), completionMax);
14
-
15
- return {
16
- completion,
17
- prompt,
18
- total,
19
- };
20
- }
21
- }