@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,17 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import listMap from './index.js';
3
-
4
- vi.mock('../../lib/chatgpt/index.js', () => ({
5
- default: vi.fn(async (prompt) => {
6
- const match = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
7
- const lines = match ? match[1].split('\n') : [];
8
- return lines.map((l) => l.toUpperCase()).join('\n');
9
- }),
10
- }));
11
-
12
- describe('list-map verblet', () => {
13
- it('maps items using instructions', async () => {
14
- const result = await listMap(['alpha', 'beta'], 'uppercase');
15
- expect(result).toStrictEqual(['ALPHA', 'BETA']);
16
- });
17
- });
@@ -1,10 +0,0 @@
1
- # list-reduce
2
-
3
- Combine an accumulator value with a list of strings using custom instructions in a single ChatGPT call. Returns the final accumulator.
4
-
5
- ```javascript
6
- import listReduce from './index.js';
7
-
8
- await listReduce('', ['alpha', 'beta', 'gamma'], 'Concatenate them');
9
- // => 'alpha beta gamma'
10
- ```
@@ -1,14 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import listReduce from './index.js';
3
- import { longTestTimeout } from '../../constants/common.js';
4
-
5
- describe('list-reduce examples', () => {
6
- it(
7
- 'combines items with custom instructions',
8
- async () => {
9
- const result = await listReduce('', ['red', 'green', 'blue'], 'join with commas');
10
- expect(result.length).toBeGreaterThan(0);
11
- },
12
- longTestTimeout
13
- );
14
- });
@@ -1,21 +0,0 @@
1
- import chatGPT from '../../lib/chatgpt/index.js';
2
- import wrapVariable from '../../prompts/wrap-variable.js';
3
-
4
- function buildPrompt(acc, list, instructions) {
5
- const instructionsBlock = wrapVariable(instructions, {
6
- tag: 'instructions',
7
- forceHTML: true,
8
- });
9
- const accBlock = wrapVariable(acc, { tag: 'accumulator', forceHTML: true });
10
- const listBlock = wrapVariable(list.join('\n'), { tag: 'list' });
11
- return `Start with the given accumulator. Apply the <instructions> to each item in <list> sequentially, using the result as the new accumulator each time. Return only the final accumulator.\n\n${instructionsBlock}\n${accBlock}\n${listBlock}`;
12
- }
13
-
14
- export default async function listReduce(acc, list, instructions, config = {}) {
15
- const { llm, ...options } = config;
16
- const output = await chatGPT(buildPrompt(acc, list, instructions), {
17
- modelOptions: { ...llm },
18
- ...options,
19
- });
20
- return output.trim();
21
- }
@@ -1,27 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import listReduce from './index.js';
3
-
4
- vi.mock('../../lib/chatgpt/index.js', () => ({
5
- default: vi.fn((prompt) => {
6
- const listMatch = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
7
- const accMatch = prompt.match(/<accumulator>\n([\s\S]*?)\n<\/accumulator>/);
8
- let lines = [];
9
-
10
- if (listMatch && accMatch) {
11
- lines = listMatch[1]
12
- .split('\n')
13
- .map((line) => line.trim())
14
- .filter(Boolean);
15
- return lines.join('+');
16
- }
17
- // Return just the joined list items
18
- return lines.join('+');
19
- }),
20
- }));
21
-
22
- describe('list-reduce verblet', () => {
23
- it('reduces items using instructions', async () => {
24
- const result = await listReduce('0', ['a', 'b', 'c'], 'join');
25
- expect(result).toBe('a+b+c');
26
- });
27
- });
@@ -1,27 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import listReduce from './index.js';
3
-
4
- vi.mock('../../lib/chatgpt/index.js', () => ({
5
- default: vi.fn((prompt) => {
6
- const listMatch = prompt.match(/<list>\n([\s\S]*?)\n<\/list>/);
7
- const accMatch = prompt.match(/<accumulator>\n([\s\S]*?)\n<\/accumulator>/);
8
-
9
- if (listMatch && accMatch) {
10
- const acc = accMatch[1].trim();
11
- const lines = listMatch[1]
12
- .split('\n')
13
- .map((line) => line.trim())
14
- .filter(Boolean);
15
- return `${acc}+${lines.join('+')}`;
16
- }
17
- // Return the joined result as expected
18
- return [acc, ...lines].join('+');
19
- }),
20
- }));
21
-
22
- describe('list-reduce verblet', () => {
23
- it('reduces items using instructions', async () => {
24
- const result = await listReduce('0', ['a', 'b', 'c'], 'join');
25
- expect(result).toBe('0+a+b+c');
26
- });
27
- });
@@ -1,15 +0,0 @@
1
- # name
2
- Generate a short, descriptive name for any text or concept.
3
-
4
- This verblet taps into the language model's understanding of nuance to create names that capture the essence of your content. Use it whenever a simple keyword search isn't enough and you want an evocative title.
5
-
6
- ## Usage
7
-
8
- ```javascript
9
- import { name } from '@far-world-labs';
10
-
11
- const diaryTitle = await name(
12
- 'Voice memos from friends sharing their hopes and worries'
13
- );
14
- console.log(diaryTitle); // "Shared Reflections" (example)
15
- ```
@@ -1,28 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { longTestTimeout } from '../../constants/common.js';
3
- import name from './index.js';
4
-
5
- const examples = [
6
- { got: { text: 'Chat logs for customer support' }, want: 'chatSupportLogs' },
7
- { got: { text: 'Sensor readings from smart home devices' }, want: 'smartHomeSensorReadings' },
8
- {
9
- got: {
10
- text: 'Voice memos from friends sharing their hopes and worries',
11
- },
12
- want: 'voiceMemos',
13
- },
14
- ];
15
-
16
- describe('name verblet', () => {
17
- examples.forEach((example) => {
18
- it(
19
- example.got.text,
20
- async () => {
21
- const result = await name(example.got.text);
22
- expect(typeof result).toBe('string');
23
- expect(result.length).toBeGreaterThan(0);
24
- },
25
- longTestTimeout
26
- );
27
- });
28
- });
@@ -1,19 +0,0 @@
1
- import chatGPT from '../../lib/chatgpt/index.js';
2
- import stripResponse from '../../lib/strip-response/index.js';
3
- import wrapVariable from '../../prompts/wrap-variable.js';
4
- import { constants as promptConstants } from '../../prompts/index.js';
5
-
6
- const { asUndefinedByDefault, contentIsQuestion } = promptConstants;
7
-
8
- export default async function name(subject, config = {}) {
9
- const { llm, ...options } = config;
10
- const prompt = `${contentIsQuestion} Suggest a concise, memorable name for the <subject>.\n\n${wrapVariable(
11
- subject,
12
- {
13
- tag: 'subject',
14
- }
15
- )} ${asUndefinedByDefault}`;
16
- const response = await chatGPT(prompt, { modelOptions: { ...llm }, ...options });
17
- const [firstLine] = stripResponse(response).split('\n');
18
- return firstLine.trim();
19
- }
@@ -1,33 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
-
3
- import name from './index.js';
4
-
5
- vi.mock('../../lib/chatgpt/index.js', () => ({
6
- default: vi.fn().mockImplementation((text) => {
7
- if (/weather pattern/i.test(text)) {
8
- return 'BlueSkies';
9
- }
10
- return 'undefined';
11
- }),
12
- }));
13
-
14
- const examples = [
15
- {
16
- name: 'Generates descriptive name',
17
- inputs: { text: 'Dataset of weather pattern observations' },
18
- want: { result: 'BlueSkies' },
19
- },
20
- {
21
- name: 'Returns undefined when unsure',
22
- inputs: { text: '???' },
23
- want: { result: 'undefined' },
24
- },
25
- ];
26
-
27
- describe('name verblet', () => {
28
- examples.forEach((example) => {
29
- it(example.name, async () => {
30
- expect(await name(example.inputs.text)).toStrictEqual(example.want.result);
31
- });
32
- });
33
- });
@@ -1,26 +0,0 @@
1
- # name-similar-to
2
-
3
- Generate a short, catchy name for something using the style of existing names. This verblet relies on a language model to capture the tone and brevity of your sample names.
4
-
5
- ```javascript
6
- import nameSimilarTo from './index.js';
7
-
8
- const newName = await nameSimilarTo(
9
- 'dataset of daily coffee tasting notes',
10
- ['BeanDiary', 'RoastLog', 'BrewIndex']
11
- );
12
- // => 'TastingLog'
13
- ```
14
-
15
- ## Example: naming a hiking journal
16
-
17
- Imagine cataloging your weekend trail adventures. You already use names like `TrailNotes`, `GearTips`, and `CampfireStories`. Ask the verblet to suggest a matching name for your wildlife sightings log:
18
-
19
- ```javascript
20
- const exampleNames = ['TrailNotes', 'GearTips', 'CampfireStories'];
21
- const wildlifeLog = await nameSimilarTo(
22
- 'journal of wildlife spotted on each hike',
23
- exampleNames
24
- );
25
- // => 'WildlifeWatch'
26
- ```
@@ -1,18 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import nameSimilarTo from './index.js';
3
- import { longTestTimeout } from '../../constants/common.js';
4
-
5
- describe('nameSimilarTo examples', () => {
6
- it(
7
- 'suggests a matching name',
8
- async () => {
9
- const result = await nameSimilarTo('record of coffee tasting notes', [
10
- 'BeanDiary',
11
- 'RoastLog',
12
- 'BrewIndex',
13
- ]);
14
- expect(typeof result).toBe('string');
15
- },
16
- longTestTimeout
17
- );
18
- });
@@ -1,20 +0,0 @@
1
- import chatGPT from '../../lib/chatgpt/index.js';
2
- import wrapVariable from '../../prompts/wrap-variable.js';
3
-
4
- const buildPrompt = (description, exampleNames) => {
5
- const descriptionBlock = wrapVariable(description, { tag: 'description' });
6
- const exampleNamesBlock = wrapVariable(exampleNames.join('\n'), { tag: 'example-names' });
7
-
8
- return `Generate a name similar to the <example-names> that fits the <description>. Return only the name, nothing else.
9
-
10
- ${descriptionBlock}
11
-
12
- ${exampleNamesBlock}`;
13
- };
14
-
15
- export default async function nameSimilarTo(description, exampleNames = [], config = {}) {
16
- const { llm, ...options } = config;
17
- const prompt = buildPrompt(description, exampleNames);
18
- const output = await chatGPT(prompt, { modelOptions: { ...llm }, ...options });
19
- return output.split('\n')[0].trim();
20
- }
@@ -1,13 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import nameSimilarTo from './index.js';
3
-
4
- vi.mock('../../lib/chatgpt/index.js', () => ({
5
- default: vi.fn(async () => 'freshName'),
6
- }));
7
-
8
- describe('nameSimilarTo verblet', () => {
9
- it('generates a name matching the example style', async () => {
10
- const result = await nameSimilarTo('some data about sales', ['salesStats', 'revenueReport']);
11
- expect(result).toBe('freshName');
12
- });
13
- });
@@ -1,199 +0,0 @@
1
- import { describe, expect, it, beforeAll, afterAll } from 'vitest';
2
-
3
- import number from './index.js';
4
- import aiExpect from '../expect/index.js';
5
- import { longTestTimeout } from '../../constants/common.js';
6
-
7
- const examples = [
8
- {
9
- inputs: { text: 'What is the height of Everest in feet' },
10
- want: { range: [29000, 29100] }, // Tolerant range around 29032
11
- },
12
- {
13
- inputs: { text: 'What is the length of the Nile in km' },
14
- want: { range: [6000, 7000] }, // Tolerant range around 6650
15
- },
16
- {
17
- inputs: { text: 'What is the my age in years' },
18
- want: { result: undefined },
19
- },
20
- ];
21
-
22
- describe('Number verblet', () => {
23
- // Set environment mode to 'none' for all tests to avoid throwing
24
- const originalMode = process.env.LLM_EXPECT_MODE;
25
-
26
- beforeAll(() => {
27
- process.env.LLM_EXPECT_MODE = 'none';
28
- });
29
-
30
- afterAll(() => {
31
- if (originalMode !== undefined) {
32
- process.env.LLM_EXPECT_MODE = originalMode;
33
- } else {
34
- delete process.env.LLM_EXPECT_MODE;
35
- }
36
- });
37
-
38
- examples.forEach((example) => {
39
- it(
40
- `${example.inputs.text}`,
41
- async () => {
42
- const result = await number(example.inputs.text);
43
-
44
- if (example.want.range) {
45
- expect(result).toBeGreaterThanOrEqual(example.want.range[0]);
46
- expect(result).toBeLessThanOrEqual(example.want.range[1]);
47
-
48
- // LLM assertion for range validation
49
- const isReasonableValue = await aiExpect(
50
- `Question: "${example.inputs.text}" Answer: ${result}`
51
- ).toSatisfy('Is this a reasonable numeric answer for a geographic question?');
52
- expect(isReasonableValue).toBe(true);
53
- } else if (example.want.result !== undefined) {
54
- expect(result).toStrictEqual(example.want.result);
55
- } else {
56
- expect(result).toStrictEqual(example.want.result);
57
-
58
- // LLM assertion for undefined results
59
- if (example.want.result === undefined) {
60
- const shouldBeUndefined = await aiExpect(
61
- `Question: "${example.inputs.text}"`
62
- ).toSatisfy('Does this question lack enough context to give a specific number?');
63
- expect(shouldBeUndefined).toBe(true);
64
- }
65
- }
66
- },
67
- longTestTimeout
68
- );
69
- });
70
-
71
- it(
72
- 'should extract numbers from recipe contexts',
73
- async () => {
74
- const recipeText =
75
- 'What temperature should I bake the cookies at? They need to be baked for 12 minutes until golden brown';
76
- const result = await number(recipeText);
77
-
78
- expect(typeof result).toBe('number');
79
- expect(result).toBeGreaterThan(0);
80
-
81
- // LLM assertion to validate recipe number extraction
82
- const isCorrectBakeTime = await aiExpect(
83
- `Recipe: "${recipeText}" Extracted number: ${result}`
84
- ).toSatisfy('Is this number related to baking time or temperature?');
85
- expect(isCorrectBakeTime).toBe(true);
86
-
87
- // LLM assertion to validate temperature unit
88
- const hasTemperatureUnit = await aiExpect(
89
- `Recipe text: "${recipeText}" Extracted number: ${result}`
90
- ).toSatisfy('Is this number likely a temperature in Fahrenheit (e.g. 350°F)?');
91
- expect(hasTemperatureUnit).toBe(true);
92
-
93
- // Additional assertion about reasonableness
94
- const isReasonableBakeTime = await aiExpect(
95
- `Extracted number: ${result} from a baking recipe`
96
- ).toSatisfy('Is this a reasonable number for cooking?');
97
- expect(isReasonableBakeTime).toBe(true);
98
- },
99
- longTestTimeout
100
- );
101
-
102
- it(
103
- 'should handle financial calculations',
104
- async () => {
105
- const financialQuery =
106
- 'If I invest $1000 at 5% annual compound interest for 10 years, how much will I have?';
107
- const result = await number(financialQuery);
108
-
109
- expect(typeof result).toBe('number');
110
- expect(result).toBeGreaterThan(1000); // Should be more than principal
111
-
112
- // LLM assertion for financial calculation accuracy
113
- const isReasonableReturn = await aiExpect(
114
- `Investment question about $1000 at 5% for 10 years. Answer: $${result}`
115
- ).toSatisfy('Is this a reasonable amount for a 10-year investment?');
116
- expect(isReasonableReturn).toBe(true);
117
-
118
- // Validate the calculation makes financial sense
119
- const followsCompoundInterest = await aiExpect(
120
- `Starting with $1000, ending with $${result} after 10 years`
121
- ).toSatisfy('Does this show reasonable investment growth?');
122
- expect(followsCompoundInterest).toBe(true);
123
- },
124
- longTestTimeout
125
- );
126
-
127
- it(
128
- 'should handle financial calculations with compound interest',
129
- async () => {
130
- const result = await number(
131
- 'If I invest $1000 at 5% annual interest for 10 years, what will be the final amount?'
132
- );
133
-
134
- expect(typeof result).toBe('number');
135
- // Simple interest would be 1000 + (1000 * 0.05 * 10) = 1500
136
- expect(result).toBeGreaterThan(1500);
137
-
138
- // LLM assertion for financial calculation accuracy
139
- const isReasonableReturn = await aiExpect(
140
- `Investment: $1000 at 5% for 10 years. Final amount: $${result}`
141
- ).toSatisfy(
142
- 'Is this a reasonable final amount for compound interest over 10 years? It should be significantly more than the principal due to compound growth.',
143
- {
144
- message: `Expected reasonable compound interest growth, but got: $${result}`,
145
- }
146
- );
147
- expect(isReasonableReturn).toBe(true);
148
-
149
- // LLM assertion for compound interest validation
150
- const followsCompoundInterest = await aiExpect(
151
- `Starting with $1000 at 5% annual interest for 10 years, the final amount is $${result}`
152
- ).toSatisfy(
153
- 'Does this final amount follow the expected pattern of compound interest growth? It should be more than simple interest (which would be $1500) and less than exponential growth.',
154
- {
155
- message: `Expected compound interest growth pattern, but got: $${result}`,
156
- }
157
- );
158
- expect(followsCompoundInterest).toBe(true);
159
- },
160
- longTestTimeout
161
- );
162
-
163
- it(
164
- 'should handle financial calculations with compound interest',
165
- async () => {
166
- const result = await number(
167
- 'If I invest $1000 at 5% annual interest for 10 years, what will be the final amount?'
168
- );
169
-
170
- expect(typeof result).toBe('number');
171
- // Simple interest would be 1000 + (1000 * 0.05 * 10) = 1500
172
- // Compound interest should be more than simple interest
173
- expect(result).toBeGreaterThan(1500);
174
-
175
- // LLM assertion for financial calculation accuracy
176
- const isReasonableReturn = await aiExpect(
177
- `Investment: $1000 at 5% for 10 years. Final amount: $${result}`
178
- ).toSatisfy(
179
- 'Is this a reasonable final amount for compound interest over 10 years? It should be significantly more than the principal due to compound growth.',
180
- {
181
- message: `Expected reasonable compound interest growth, but got: $${result}`,
182
- }
183
- );
184
- expect(isReasonableReturn).toBe(true);
185
-
186
- // LLM assertion for compound interest validation
187
- const followsCompoundInterest = await aiExpect(
188
- `Starting with $1000 at 5% annual interest for 10 years, the final amount is $${result}`
189
- ).toSatisfy(
190
- 'Does this final amount follow the expected pattern of compound interest growth? It should be more than simple interest (which would be $1500) and less than exponential growth.',
191
- {
192
- message: `Expected compound interest growth pattern, but got: $${result}`,
193
- }
194
- );
195
- expect(followsCompoundInterest).toBe(true);
196
- },
197
- longTestTimeout
198
- );
199
- });
@@ -1,25 +0,0 @@
1
- import chatGPT from '../../lib/chatgpt/index.js';
2
- import stripResponse from '../../lib/strip-response/index.js';
3
- import toNumber from '../../lib/to-number/index.js';
4
- import { constants as promptConstants } from '../../prompts/index.js';
5
-
6
- const {
7
- asNumber,
8
- asUndefinedByDefault,
9
- contentIsQuestion,
10
- explainAndSeparate,
11
- explainAndSeparatePrimitive,
12
- } = promptConstants;
13
-
14
- export default async (text, config = {}) => {
15
- const { llm, ...options } = config;
16
- const numberText = `${contentIsQuestion} ${text}
17
-
18
- ${explainAndSeparate} ${explainAndSeparatePrimitive}
19
-
20
- ${asNumber} ${asUndefinedByDefault}`;
21
-
22
- return toNumber(
23
- stripResponse(await chatGPT(numberText, { modelOptions: { ...llm }, ...options }))
24
- );
25
- };
@@ -1,33 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
-
3
- import number from './index.js';
4
-
5
- vi.mock('../../lib/chatgpt/index.js', () => ({
6
- default: vi.fn().mockImplementation((text) => {
7
- if (/Everest/.test(text)) {
8
- return '29029';
9
- }
10
- return 'undefined';
11
- }),
12
- }));
13
-
14
- const examples = [
15
- {
16
- name: 'Basic usage',
17
- inputs: { text: 'What is the height of Everest in feet' },
18
- want: { result: 29029 },
19
- },
20
- {
21
- name: 'Unanswerable question',
22
- inputs: { text: 'What is the my age in years' },
23
- want: { result: undefined },
24
- },
25
- ];
26
-
27
- describe('Number verblet', () => {
28
- examples.forEach((example) => {
29
- it(example.name, async () => {
30
- expect(await number(example.inputs.text)).toStrictEqual(example.want.result);
31
- });
32
- });
33
- });
@@ -1,38 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
-
3
- import numberWithUnits from './index.js';
4
- import { longTestTimeout } from '../../constants/common.js';
5
-
6
- const examples = [
7
- {
8
- inputs: { text: 'What is the height of Everest in feet' },
9
- want: { valueRange: [29029, 29032], unit: 'feet' },
10
- },
11
- {
12
- inputs: { text: 'What is my age in years' },
13
- want: { value: undefined, unit: 'years' },
14
- },
15
- ];
16
-
17
- describe('Number with units verblet', () => {
18
- examples.forEach((example) => {
19
- it(
20
- example.inputs.text,
21
- async () => {
22
- const result = await numberWithUnits(example.inputs.text);
23
-
24
- if (example.want.value) {
25
- expect(result?.value).toStrictEqual(example.want.value);
26
- }
27
- if (example.want.valueRange) {
28
- expect(result?.value).toBeGreaterThanOrEqual(example.want.valueRange[0]);
29
- expect(result?.value).toBeLessThanOrEqual(example.want.valueRange[1]);
30
- }
31
- if (example.want.unit) {
32
- expect(result?.unit).toStrictEqual(example.want.unit);
33
- }
34
- },
35
- longTestTimeout
36
- );
37
- });
38
- });