@llm-newsletter-kit/core 1.3.8 → 1.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  var runnables = require('@langchain/core/runnables');
4
4
  var esToolkit = require('es-toolkit');
5
- var ai = require('ai');
6
5
  var zod = require('zod');
6
+ var ai = require('ai');
7
7
  var jsdom = require('jsdom');
8
8
  var juice = require('juice');
9
9
  var safeMarkdown2Html = require('safe-markdown2html');
@@ -91,6 +91,25 @@ class LoggingExecutor {
91
91
  }
92
92
  }
93
93
 
94
+ async function generateObjectByLLM({ schema, ...rest }) {
95
+ const result = await ai.generateText({
96
+ ...rest,
97
+ output: ai.Output.object({ schema }),
98
+ // Anthropic truncates structured output when it contains quotation marks.
99
+ // Using 'jsonTool' mode avoids this issue.
100
+ providerOptions: {
101
+ anthropic: {
102
+ structuredOutputMode: 'jsonTool',
103
+ },
104
+ },
105
+ });
106
+ return {
107
+ output: result.output,
108
+ usage: result.usage,
109
+ finishReason: result.finishReason,
110
+ };
111
+ }
112
+
94
113
  /**
95
114
  * Replaces ASCII double quotes with Unicode smart quotes (U+201C, U+201D).
96
115
  * Prevents JSON structured output corruption when LLM reproduces quoted titles.
@@ -186,12 +205,10 @@ class AnalyzeImages extends LLMQuery {
186
205
  if (this.imageMessages.length === 0) {
187
206
  return { result: null, usage: ZERO_USAGE };
188
207
  }
189
- const { output, usage } = await ai.generateText({
208
+ const { output, usage } = await generateObjectByLLM({
190
209
  model: this.model,
191
210
  maxRetries: this.options.llm.maxRetries,
192
- output: ai.Output.object({
193
- schema: this.schema,
194
- }),
211
+ schema: this.schema,
195
212
  system: this.systemPrompt,
196
213
  messages: [
197
214
  {
@@ -316,12 +333,10 @@ class ClassifyTags extends LLMQuery {
316
333
  }
317
334
  async execute({ existTags }) {
318
335
  this.existTags = existTags;
319
- const { output, usage } = await ai.generateText({
336
+ const { output, usage } = await generateObjectByLLM({
320
337
  model: this.model,
321
338
  maxRetries: this.options.llm.maxRetries,
322
- output: ai.Output.object({
323
- schema: this.schema,
324
- }),
339
+ schema: this.schema,
325
340
  system: this.systemPrompt,
326
341
  prompt: this.userPrompt,
327
342
  });
@@ -398,12 +413,10 @@ class DetermineArticleImportance extends LLMQuery {
398
413
  this.dateService = config.dateService;
399
414
  }
400
415
  async execute() {
401
- const { output, usage } = await ai.generateText({
416
+ const { output, usage } = await generateObjectByLLM({
402
417
  model: this.model,
403
418
  maxRetries: this.options.llm.maxRetries,
404
- output: ai.Output.object({
405
- schema: this.schema,
406
- }),
419
+ schema: this.schema,
407
420
  system: this.systemPrompt,
408
421
  prompt: this.userPrompt,
409
422
  });
@@ -940,7 +953,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
940
953
  this.newsletterBrandName = config.newsletterBrandName;
941
954
  }
942
955
  async execute() {
943
- const { output, usage, finishReason } = await ai.generateText({
956
+ const { output, usage, finishReason } = await generateObjectByLLM({
944
957
  model: this.model,
945
958
  maxRetries: this.options.llm.maxRetries,
946
959
  maxOutputTokens: this.maxOutputTokens,
@@ -949,9 +962,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
949
962
  topK: this.topK,
950
963
  presencePenalty: this.presencePenalty,
951
964
  frequencyPenalty: this.frequencyPenalty,
952
- output: ai.Output.object({
953
- schema: this.schema,
954
- }),
965
+ schema: this.schema,
955
966
  system: this.systemPrompt,
956
967
  prompt: this.userPrompt,
957
968
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { RunnablePassthrough, RunnableSequence } from '@langchain/core/runnables';
2
2
  import { pick, omit } from 'es-toolkit';
3
- import { generateText, Output } from 'ai';
4
3
  import { z } from 'zod';
4
+ import { generateText, Output } from 'ai';
5
5
  import { JSDOM } from 'jsdom';
6
6
  import juice from 'juice';
7
7
  import safeMarkdown2Html from 'safe-markdown2html';
@@ -89,6 +89,25 @@ class LoggingExecutor {
89
89
  }
90
90
  }
91
91
 
92
+ async function generateObjectByLLM({ schema, ...rest }) {
93
+ const result = await generateText({
94
+ ...rest,
95
+ output: Output.object({ schema }),
96
+ // Anthropic truncates structured output when it contains quotation marks.
97
+ // Using 'jsonTool' mode avoids this issue.
98
+ providerOptions: {
99
+ anthropic: {
100
+ structuredOutputMode: 'jsonTool',
101
+ },
102
+ },
103
+ });
104
+ return {
105
+ output: result.output,
106
+ usage: result.usage,
107
+ finishReason: result.finishReason,
108
+ };
109
+ }
110
+
92
111
  /**
93
112
  * Replaces ASCII double quotes with Unicode smart quotes (U+201C, U+201D).
94
113
  * Prevents JSON structured output corruption when LLM reproduces quoted titles.
@@ -184,12 +203,10 @@ class AnalyzeImages extends LLMQuery {
184
203
  if (this.imageMessages.length === 0) {
185
204
  return { result: null, usage: ZERO_USAGE };
186
205
  }
187
- const { output, usage } = await generateText({
206
+ const { output, usage } = await generateObjectByLLM({
188
207
  model: this.model,
189
208
  maxRetries: this.options.llm.maxRetries,
190
- output: Output.object({
191
- schema: this.schema,
192
- }),
209
+ schema: this.schema,
193
210
  system: this.systemPrompt,
194
211
  messages: [
195
212
  {
@@ -314,12 +331,10 @@ class ClassifyTags extends LLMQuery {
314
331
  }
315
332
  async execute({ existTags }) {
316
333
  this.existTags = existTags;
317
- const { output, usage } = await generateText({
334
+ const { output, usage } = await generateObjectByLLM({
318
335
  model: this.model,
319
336
  maxRetries: this.options.llm.maxRetries,
320
- output: Output.object({
321
- schema: this.schema,
322
- }),
337
+ schema: this.schema,
323
338
  system: this.systemPrompt,
324
339
  prompt: this.userPrompt,
325
340
  });
@@ -396,12 +411,10 @@ class DetermineArticleImportance extends LLMQuery {
396
411
  this.dateService = config.dateService;
397
412
  }
398
413
  async execute() {
399
- const { output, usage } = await generateText({
414
+ const { output, usage } = await generateObjectByLLM({
400
415
  model: this.model,
401
416
  maxRetries: this.options.llm.maxRetries,
402
- output: Output.object({
403
- schema: this.schema,
404
- }),
417
+ schema: this.schema,
405
418
  system: this.systemPrompt,
406
419
  prompt: this.userPrompt,
407
420
  });
@@ -938,7 +951,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
938
951
  this.newsletterBrandName = config.newsletterBrandName;
939
952
  }
940
953
  async execute() {
941
- const { output, usage, finishReason } = await generateText({
954
+ const { output, usage, finishReason } = await generateObjectByLLM({
942
955
  model: this.model,
943
956
  maxRetries: this.options.llm.maxRetries,
944
957
  maxOutputTokens: this.maxOutputTokens,
@@ -947,9 +960,7 @@ let GenerateNewsletter$1 = class GenerateNewsletter extends BaseLLMQuery {
947
960
  topK: this.topK,
948
961
  presencePenalty: this.presencePenalty,
949
962
  frequencyPenalty: this.frequencyPenalty,
950
- output: Output.object({
951
- schema: this.schema,
952
- }),
963
+ schema: this.schema,
953
964
  system: this.systemPrompt,
954
965
  prompt: this.userPrompt,
955
966
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@llm-newsletter-kit/core",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "1.3.8",
5
+ "version": "1.3.9",
6
6
  "description": "An extensible framework to automate your entire newsletter workflow. Handles data collection, LLM-based content analysis, and email generation, letting you focus on your unique domain logic.",
7
7
  "main": "dist/index.cjs",
8
8
  "module": "dist/index.js",
@@ -48,36 +48,36 @@
48
48
  "author": "kimhongyeon",
49
49
  "license": "Apache-2.0",
50
50
  "dependencies": {
51
- "@langchain/core": "^1.1.35",
52
- "ai": "^6.0.134",
51
+ "@langchain/core": "^1.1.39",
52
+ "ai": "^6.0.154",
53
53
  "es-toolkit": "^1.45.1",
54
- "jsdom": "^29.0.1",
54
+ "jsdom": "^29.0.2",
55
55
  "juice": "^11.1.1",
56
56
  "safe-markdown2html": "^1.0.1",
57
57
  "zod": "^4.3.6"
58
58
  },
59
59
  "devDependencies": {
60
- "@ai-sdk/anthropic": "^3.0.63",
61
- "@ai-sdk/google": "^3.0.52",
62
- "@ai-sdk/openai": "^3.0.47",
63
- "@ai-sdk/togetherai": "^2.0.41",
60
+ "@ai-sdk/anthropic": "^3.0.68",
61
+ "@ai-sdk/google": "^3.0.60",
62
+ "@ai-sdk/openai": "^3.0.52",
63
+ "@ai-sdk/togetherai": "^2.0.45",
64
64
  "@eslint/js": "^10.0.1",
65
65
  "@trivago/prettier-plugin-sort-imports": "^6.0.2",
66
66
  "@types/jsdom": "^28.0.1",
67
- "@types/node": "^25.5.0",
68
- "@vitest/coverage-v8": "^4.1.0",
69
- "@vitest/expect": "^4.1.0",
70
- "eslint": "^10.1.0",
67
+ "@types/node": "^25.5.2",
68
+ "@vitest/coverage-v8": "^4.1.4",
69
+ "@vitest/expect": "^4.1.4",
70
+ "eslint": "^10.2.0",
71
71
  "eslint-plugin-unused-imports": "^4.4.1",
72
72
  "prettier": "^3.8.1",
73
73
  "rimraf": "^6.1.3",
74
- "rollup": "^4.60.0",
74
+ "rollup": "^4.60.1",
75
75
  "rollup-plugin-dts": "^6.4.1",
76
- "rollup-plugin-typescript2": "^0.36.0",
76
+ "rollup-plugin-typescript2": "^0.37.0",
77
77
  "tsx": "^4.21.0",
78
- "typescript": "^5.9.3",
79
- "typescript-eslint": "^8.57.1",
80
- "vitest": "^4.1.0"
78
+ "typescript": "^6.0.2",
79
+ "typescript-eslint": "^8.58.1",
80
+ "vitest": "^4.1.4"
81
81
  },
82
82
  "repository": {
83
83
  "type": "git",