markdown-ai-rewriter 0.4.0 → 0.5.0

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 (112) hide show
  1. package/dist/cli.js +135 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/providers/anthropic.d.ts.map +1 -1
  4. package/dist/core/providers/anthropic.js +3 -2
  5. package/dist/core/providers/anthropic.js.map +1 -1
  6. package/dist/core/providers/azure-openai.d.ts.map +1 -1
  7. package/dist/core/providers/azure-openai.js +4 -3
  8. package/dist/core/providers/azure-openai.js.map +1 -1
  9. package/dist/core/providers/base.d.ts +2 -2
  10. package/dist/core/providers/base.d.ts.map +1 -1
  11. package/dist/core/providers/base.js +19 -4
  12. package/dist/core/providers/base.js.map +1 -1
  13. package/dist/core/providers/minimax.d.ts.map +1 -1
  14. package/dist/core/providers/minimax.js +4 -3
  15. package/dist/core/providers/minimax.js.map +1 -1
  16. package/dist/core/providers/openai-compatible.d.ts.map +1 -1
  17. package/dist/core/providers/openai-compatible.js +3 -2
  18. package/dist/core/providers/openai-compatible.js.map +1 -1
  19. package/dist/core/providers/openai.d.ts.map +1 -1
  20. package/dist/core/providers/openai.js +4 -3
  21. package/dist/core/providers/openai.js.map +1 -1
  22. package/dist/core/rewriter.d.ts +9 -0
  23. package/dist/core/rewriter.d.ts.map +1 -1
  24. package/dist/core/rewriter.js +116 -11
  25. package/dist/core/rewriter.js.map +1 -1
  26. package/dist/core/text-providers/anthropic.d.ts +12 -0
  27. package/dist/core/text-providers/anthropic.d.ts.map +1 -0
  28. package/dist/core/text-providers/anthropic.js +78 -0
  29. package/dist/core/text-providers/anthropic.js.map +1 -0
  30. package/dist/core/text-providers/azure-openai.d.ts +15 -0
  31. package/dist/core/text-providers/azure-openai.d.ts.map +1 -0
  32. package/dist/core/text-providers/azure-openai.js +87 -0
  33. package/dist/core/text-providers/azure-openai.js.map +1 -0
  34. package/dist/core/text-providers/base.d.ts +12 -0
  35. package/dist/core/text-providers/base.d.ts.map +1 -0
  36. package/dist/core/text-providers/base.js +66 -0
  37. package/dist/core/text-providers/base.js.map +1 -0
  38. package/dist/core/text-providers/deepseek.d.ts +6 -0
  39. package/dist/core/text-providers/deepseek.d.ts.map +1 -0
  40. package/dist/core/text-providers/deepseek.js +12 -0
  41. package/dist/core/text-providers/deepseek.js.map +1 -0
  42. package/dist/core/text-providers/doubao.d.ts +6 -0
  43. package/dist/core/text-providers/doubao.d.ts.map +1 -0
  44. package/dist/core/text-providers/doubao.js +12 -0
  45. package/dist/core/text-providers/doubao.js.map +1 -0
  46. package/dist/core/text-providers/gemini.d.ts +6 -0
  47. package/dist/core/text-providers/gemini.d.ts.map +1 -0
  48. package/dist/core/text-providers/gemini.js +12 -0
  49. package/dist/core/text-providers/gemini.js.map +1 -0
  50. package/dist/core/text-providers/glm.d.ts +6 -0
  51. package/dist/core/text-providers/glm.d.ts.map +1 -0
  52. package/dist/core/text-providers/glm.js +12 -0
  53. package/dist/core/text-providers/glm.js.map +1 -0
  54. package/dist/core/text-providers/minimax.d.ts +20 -0
  55. package/dist/core/text-providers/minimax.d.ts.map +1 -0
  56. package/dist/core/text-providers/minimax.js +88 -0
  57. package/dist/core/text-providers/minimax.js.map +1 -0
  58. package/dist/core/text-providers/openai-compatible.d.ts +14 -0
  59. package/dist/core/text-providers/openai-compatible.d.ts.map +1 -0
  60. package/dist/core/text-providers/openai-compatible.js +82 -0
  61. package/dist/core/text-providers/openai-compatible.js.map +1 -0
  62. package/dist/core/text-providers/openai.d.ts +12 -0
  63. package/dist/core/text-providers/openai.d.ts.map +1 -0
  64. package/dist/core/text-providers/openai.js +77 -0
  65. package/dist/core/text-providers/openai.js.map +1 -0
  66. package/dist/core/text-providers/openrouter.d.ts +6 -0
  67. package/dist/core/text-providers/openrouter.d.ts.map +1 -0
  68. package/dist/core/text-providers/openrouter.js +12 -0
  69. package/dist/core/text-providers/openrouter.js.map +1 -0
  70. package/dist/core/text-providers/qwen.d.ts +6 -0
  71. package/dist/core/text-providers/qwen.d.ts.map +1 -0
  72. package/dist/core/text-providers/qwen.js +12 -0
  73. package/dist/core/text-providers/qwen.js.map +1 -0
  74. package/dist/core/text-providers/wenxin.d.ts +6 -0
  75. package/dist/core/text-providers/wenxin.d.ts.map +1 -0
  76. package/dist/core/text-providers/wenxin.js +12 -0
  77. package/dist/core/text-providers/wenxin.js.map +1 -0
  78. package/dist/core/video-generator.d.ts +65 -0
  79. package/dist/core/video-generator.d.ts.map +1 -0
  80. package/dist/core/video-generator.js +140 -0
  81. package/dist/core/video-generator.js.map +1 -0
  82. package/dist/core/video-providers/doubao.d.ts +52 -0
  83. package/dist/core/video-providers/doubao.d.ts.map +1 -0
  84. package/dist/core/video-providers/doubao.js +148 -0
  85. package/dist/core/video-providers/doubao.js.map +1 -0
  86. package/dist/core/video-providers/index.d.ts +6 -0
  87. package/dist/core/video-providers/index.d.ts.map +1 -0
  88. package/dist/core/video-providers/index.js +16 -0
  89. package/dist/core/video-providers/index.js.map +1 -0
  90. package/dist/core/video-providers/kling.d.ts +27 -0
  91. package/dist/core/video-providers/kling.d.ts.map +1 -0
  92. package/dist/core/video-providers/kling.js +113 -0
  93. package/dist/core/video-providers/kling.js.map +1 -0
  94. package/dist/core/video-providers/minimax.d.ts +30 -0
  95. package/dist/core/video-providers/minimax.d.ts.map +1 -0
  96. package/dist/core/video-providers/minimax.js +133 -0
  97. package/dist/core/video-providers/minimax.js.map +1 -0
  98. package/dist/core/video-providers/runway.d.ts +22 -0
  99. package/dist/core/video-providers/runway.d.ts.map +1 -0
  100. package/dist/core/video-providers/runway.js +121 -0
  101. package/dist/core/video-providers/runway.js.map +1 -0
  102. package/dist/core/video-providers/types.d.ts +41 -0
  103. package/dist/core/video-providers/types.d.ts.map +1 -0
  104. package/dist/core/video-providers/types.js +3 -0
  105. package/dist/core/video-providers/types.js.map +1 -0
  106. package/dist/index.d.ts +21 -13
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +29 -14
  109. package/dist/index.js.map +1 -1
  110. package/dist/types/index.d.ts +36 -0
  111. package/dist/types/index.d.ts.map +1 -1
  112. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/minimax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7C,8GAA8G;AAC9G,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,IAAI,SAAa;IACjB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA6B;IAE3C;;;;OAIG;gBAED,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAuB,EAC9B,OAAO,CAAC,EAAE,MAAM;YAQJ,SAAS;IAWjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAyBtE"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MinimaxProvider = exports.DEFAULT_MINIMAX_BASE_URL = void 0;
37
+ const base_1 = require("./base");
38
+ /** MiniMax OpenAI-compatible base URL (see https://platform.minimax.io/docs/api-reference/text-openai-api) */
39
+ exports.DEFAULT_MINIMAX_BASE_URL = 'https://api.minimaxi.com/v1';
40
+ class MinimaxProvider extends base_1.BaseProvider {
41
+ /**
42
+ * @param apiKey MiniMax API key from the console
43
+ * @param model e.g. MiniMax-M2.1, MiniMax-M2.7 (see MiniMax docs)
44
+ * @param baseURL Override API base; default MINIMAX_BASE_URL env or `https://api.minimaxi.com/v1`
45
+ */
46
+ constructor(apiKey, model = 'MiniMax-M2.1', baseURL) {
47
+ super();
48
+ this.name = 'minimax';
49
+ this.client = null;
50
+ this.apiKey = apiKey;
51
+ this.model = model;
52
+ this.baseURL = baseURL || process.env.MINIMAX_BASE_URL || exports.DEFAULT_MINIMAX_BASE_URL;
53
+ }
54
+ async getClient() {
55
+ if (!this.client) {
56
+ const OpenAI = await Promise.resolve().then(() => __importStar(require('openai'))).then(m => m.default || m);
57
+ this.client = new OpenAI({
58
+ apiKey: this.apiKey,
59
+ baseURL: this.baseURL,
60
+ });
61
+ }
62
+ return this.client;
63
+ }
64
+ async rewrite(text, options) {
65
+ try {
66
+ const client = await this.getClient();
67
+ const originalLength = text.length;
68
+ const response = await client.chat.completions.create({
69
+ model: this.model,
70
+ messages: [
71
+ { role: 'system', content: this.getSystemPrompt(options, originalLength) },
72
+ { role: 'user', content: this.getUserPrompt(text, options.preserveLength) },
73
+ ],
74
+ temperature: options.temperature ?? 0.7,
75
+ max_tokens: options.maxTokens ?? 2000,
76
+ });
77
+ return this.cleanupThinkingContent(response.choices[0]?.message?.content?.trim() || text);
78
+ }
79
+ catch (error) {
80
+ if (error.code === 'MODULE_NOT_FOUND') {
81
+ throw new Error('OpenAI SDK not installed. MiniMax uses the OpenAI-compatible API. Run: npm install openai');
82
+ }
83
+ throw new Error(`MiniMax API error: ${error.message}`);
84
+ }
85
+ }
86
+ }
87
+ exports.MinimaxProvider = MinimaxProvider;
88
+ //# sourceMappingURL=minimax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimax.js","sourceRoot":"","sources":["../../../src/core/text-providers/minimax.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAsC;AAKtC,8GAA8G;AACjG,QAAA,wBAAwB,GAAG,6BAA6B,CAAC;AAEtE,MAAa,eAAgB,SAAQ,mBAAY;IAO/C;;;;OAIG;IACH,YACE,MAAc,EACd,QAAgB,cAAc,EAC9B,OAAgB;QAEhB,KAAK,EAAE,CAAC;QAhBV,SAAI,GAAG,SAAS,CAAC;QAIT,WAAM,GAAwB,IAAI,CAAC;QAazC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,gCAAwB,CAAC;IACrF,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,kDAAO,QAAQ,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAiB,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAuB;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;YAEnC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;oBAC1E,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE;iBAC5E;gBACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;gBACvC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;aACtC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,2FAA2F,CAC5F,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF;AA3DD,0CA2DC"}
@@ -0,0 +1,14 @@
1
+ import { BaseProvider } from './base';
2
+ import { RewriteOptions } from '../../types';
3
+ export declare class OpenAICompatibleProvider extends BaseProvider {
4
+ name: string;
5
+ private apiKey;
6
+ private model;
7
+ private baseURL;
8
+ private sdkInstallHint;
9
+ private client;
10
+ constructor(providerName: string, apiKey: string, model: string, baseURL: string, sdkInstallHint?: string);
11
+ private getClient;
12
+ rewrite(text: string, options: RewriteOptions): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=openai-compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/openai-compatible.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7C,qBAAa,wBAAyB,SAAQ,YAAY;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAA6B;gBAGzC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,cAAc,GAAE,MAAgC;YAUpC,SAAS;IAWjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAuBtE"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OpenAICompatibleProvider = void 0;
37
+ const base_1 = require("./base");
38
+ class OpenAICompatibleProvider extends base_1.BaseProvider {
39
+ constructor(providerName, apiKey, model, baseURL, sdkInstallHint = 'OpenAI-compatible API') {
40
+ super();
41
+ this.client = null;
42
+ this.name = providerName;
43
+ this.apiKey = apiKey;
44
+ this.model = model;
45
+ this.baseURL = baseURL;
46
+ this.sdkInstallHint = sdkInstallHint;
47
+ }
48
+ async getClient() {
49
+ if (!this.client) {
50
+ const OpenAI = await Promise.resolve().then(() => __importStar(require('openai'))).then(m => m.default || m);
51
+ this.client = new OpenAI({
52
+ apiKey: this.apiKey,
53
+ baseURL: this.baseURL,
54
+ });
55
+ }
56
+ return this.client;
57
+ }
58
+ async rewrite(text, options) {
59
+ try {
60
+ const client = await this.getClient();
61
+ const originalLength = text.length;
62
+ const response = await client.chat.completions.create({
63
+ model: this.model,
64
+ messages: [
65
+ { role: 'system', content: this.getSystemPrompt(options, originalLength) },
66
+ { role: 'user', content: this.getUserPrompt(text, options.preserveLength) },
67
+ ],
68
+ temperature: options.temperature ?? 0.7,
69
+ max_tokens: options.maxTokens ?? 2000,
70
+ });
71
+ return this.cleanupThinkingContent(response.choices[0]?.message?.content?.trim() || text);
72
+ }
73
+ catch (error) {
74
+ if (error.code === 'MODULE_NOT_FOUND') {
75
+ throw new Error(`OpenAI SDK not installed. ${this.sdkInstallHint}. Run: npm install openai`);
76
+ }
77
+ throw new Error(`${this.name} API error: ${error.message}`);
78
+ }
79
+ }
80
+ }
81
+ exports.OpenAICompatibleProvider = OpenAICompatibleProvider;
82
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../../src/core/text-providers/openai-compatible.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAsC;AAKtC,MAAa,wBAAyB,SAAQ,mBAAY;IAQxD,YACE,YAAoB,EACpB,MAAc,EACd,KAAa,EACb,OAAe,EACf,iBAAyB,uBAAuB;QAEhD,KAAK,EAAE,CAAC;QATF,WAAM,GAAwB,IAAI,CAAC;QAUzC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,kDAAO,QAAQ,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAiB,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAuB;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;YAEnC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;oBAC1E,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE;iBAC5E;gBACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;gBACvC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;aACtC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,cAAc,2BAA2B,CAAC,CAAC;YAC/F,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF;AAzDD,4DAyDC"}
@@ -0,0 +1,12 @@
1
+ import { BaseProvider } from './base';
2
+ import { RewriteOptions } from '../../types';
3
+ export declare class OpenAIProvider extends BaseProvider {
4
+ name: string;
5
+ private apiKey;
6
+ private model;
7
+ private client;
8
+ constructor(apiKey: string, model?: string);
9
+ private getClient;
10
+ rewrite(text: string, options: RewriteOptions): Promise<string>;
11
+ }
12
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAI7C,qBAAa,cAAe,SAAQ,YAAY;IAC9C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAsB;YAM3C,SAAS;IAQjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAuBtE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OpenAIProvider = void 0;
37
+ const base_1 = require("./base");
38
+ class OpenAIProvider extends base_1.BaseProvider {
39
+ constructor(apiKey, model = 'gpt-4o-mini') {
40
+ super();
41
+ this.name = 'openai';
42
+ this.client = null;
43
+ this.apiKey = apiKey;
44
+ this.model = model;
45
+ }
46
+ async getClient() {
47
+ if (!this.client) {
48
+ const OpenAI = await Promise.resolve().then(() => __importStar(require('openai'))).then(m => m.default || m);
49
+ this.client = new OpenAI({ apiKey: this.apiKey });
50
+ }
51
+ return this.client;
52
+ }
53
+ async rewrite(text, options) {
54
+ try {
55
+ const client = await this.getClient();
56
+ const originalLength = text.length;
57
+ const response = await client.chat.completions.create({
58
+ model: this.model,
59
+ messages: [
60
+ { role: 'system', content: this.getSystemPrompt(options, originalLength) },
61
+ { role: 'user', content: this.getUserPrompt(text, options.preserveLength) },
62
+ ],
63
+ temperature: options.temperature ?? 0.7,
64
+ max_tokens: options.maxTokens ?? 2000,
65
+ });
66
+ return this.cleanupThinkingContent(response.choices[0]?.message?.content?.trim() || text);
67
+ }
68
+ catch (error) {
69
+ if (error.code === 'MODULE_NOT_FOUND') {
70
+ throw new Error('OpenAI SDK not installed. Run: npm install openai');
71
+ }
72
+ throw new Error(`OpenAI API error: ${error.message}`);
73
+ }
74
+ }
75
+ }
76
+ exports.OpenAIProvider = OpenAIProvider;
77
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/core/text-providers/openai.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAsC;AAKtC,MAAa,cAAe,SAAQ,mBAAY;IAM9C,YAAY,MAAc,EAAE,QAAgB,aAAa;QACvD,KAAK,EAAE,CAAC;QANV,SAAI,GAAG,QAAQ,CAAC;QAGR,WAAM,GAAwB,IAAI,CAAC;QAIzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,MAAM,kDAAO,QAAQ,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAiB,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,OAAuB;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;YAEnC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACpD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;oBAC1E,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE;iBAC5E;gBACD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG;gBACvC,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;aACtC,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF;AA3CD,wCA2CC"}
@@ -0,0 +1,6 @@
1
+ import { OpenAICompatibleProvider } from './openai-compatible';
2
+ export declare const DEFAULT_OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
3
+ export declare class OpenRouterProvider extends OpenAICompatibleProvider {
4
+ constructor(apiKey: string, model?: string, baseURL?: string);
5
+ }
6
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,eAAO,MAAM,2BAA2B,iCAAiC,CAAC;AAE1E,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAA6B,EAAE,OAAO,CAAC,EAAE,MAAM;CASnF"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenRouterProvider = exports.DEFAULT_OPENROUTER_BASE_URL = void 0;
4
+ const openai_compatible_1 = require("./openai-compatible");
5
+ exports.DEFAULT_OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
6
+ class OpenRouterProvider extends openai_compatible_1.OpenAICompatibleProvider {
7
+ constructor(apiKey, model = 'openai/gpt-4o-mini', baseURL) {
8
+ super('openrouter', apiKey, model, baseURL || process.env.OPENROUTER_BASE_URL || exports.DEFAULT_OPENROUTER_BASE_URL, 'OpenRouter uses an OpenAI-compatible endpoint');
9
+ }
10
+ }
11
+ exports.OpenRouterProvider = OpenRouterProvider;
12
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/core/text-providers/openrouter.ts"],"names":[],"mappings":";;;AAAA,2DAA+D;AAElD,QAAA,2BAA2B,GAAG,8BAA8B,CAAC;AAE1E,MAAa,kBAAmB,SAAQ,4CAAwB;IAC9D,YAAY,MAAc,EAAE,QAAgB,oBAAoB,EAAE,OAAgB;QAChF,KAAK,CACH,YAAY,EACZ,MAAM,EACN,KAAK,EACL,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,mCAA2B,EACzE,+CAA+C,CAChD,CAAC;IACJ,CAAC;CACF;AAVD,gDAUC"}
@@ -0,0 +1,6 @@
1
+ import { OpenAICompatibleProvider } from './openai-compatible';
2
+ export declare const DEFAULT_QWEN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";
3
+ export declare class QwenProvider extends OpenAICompatibleProvider {
4
+ constructor(apiKey: string, model?: string, baseURL?: string);
5
+ }
6
+ //# sourceMappingURL=qwen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/qwen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,eAAO,MAAM,qBAAqB,sDAAsD,CAAC;AAEzF,qBAAa,YAAa,SAAQ,wBAAwB;gBAC5C,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAoB,EAAE,OAAO,CAAC,EAAE,MAAM;CAS1E"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QwenProvider = exports.DEFAULT_QWEN_BASE_URL = void 0;
4
+ const openai_compatible_1 = require("./openai-compatible");
5
+ exports.DEFAULT_QWEN_BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
6
+ class QwenProvider extends openai_compatible_1.OpenAICompatibleProvider {
7
+ constructor(apiKey, model = 'qwen-plus', baseURL) {
8
+ super('qwen', apiKey, model, baseURL || process.env.QWEN_BASE_URL || exports.DEFAULT_QWEN_BASE_URL, 'Qwen (DashScope) uses an OpenAI-compatible endpoint');
9
+ }
10
+ }
11
+ exports.QwenProvider = QwenProvider;
12
+ //# sourceMappingURL=qwen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../../src/core/text-providers/qwen.ts"],"names":[],"mappings":";;;AAAA,2DAA+D;AAElD,QAAA,qBAAqB,GAAG,mDAAmD,CAAC;AAEzF,MAAa,YAAa,SAAQ,4CAAwB;IACxD,YAAY,MAAc,EAAE,QAAgB,WAAW,EAAE,OAAgB;QACvE,KAAK,CACH,MAAM,EACN,MAAM,EACN,KAAK,EACL,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,6BAAqB,EAC7D,qDAAqD,CACtD,CAAC;IACJ,CAAC;CACF;AAVD,oCAUC"}
@@ -0,0 +1,6 @@
1
+ import { OpenAICompatibleProvider } from './openai-compatible';
2
+ export declare const DEFAULT_WENXIN_BASE_URL = "https://qianfan.baidubce.com/v2";
3
+ export declare class WenxinProvider extends OpenAICompatibleProvider {
4
+ constructor(apiKey: string, model?: string, baseURL?: string);
5
+ }
6
+ //# sourceMappingURL=wenxin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wenxin.d.ts","sourceRoot":"","sources":["../../../src/core/text-providers/wenxin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAEzE,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAA8B,EAAE,OAAO,CAAC,EAAE,MAAM;CASpF"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WenxinProvider = exports.DEFAULT_WENXIN_BASE_URL = void 0;
4
+ const openai_compatible_1 = require("./openai-compatible");
5
+ exports.DEFAULT_WENXIN_BASE_URL = 'https://qianfan.baidubce.com/v2';
6
+ class WenxinProvider extends openai_compatible_1.OpenAICompatibleProvider {
7
+ constructor(apiKey, model = 'ernie-4.0-8k-latest', baseURL) {
8
+ super('wenxin', apiKey, model, baseURL || process.env.WENXIN_BASE_URL || exports.DEFAULT_WENXIN_BASE_URL, 'Wenxin (Qianfan) uses an OpenAI-compatible endpoint');
9
+ }
10
+ }
11
+ exports.WenxinProvider = WenxinProvider;
12
+ //# sourceMappingURL=wenxin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wenxin.js","sourceRoot":"","sources":["../../../src/core/text-providers/wenxin.ts"],"names":[],"mappings":";;;AAAA,2DAA+D;AAElD,QAAA,uBAAuB,GAAG,iCAAiC,CAAC;AAEzE,MAAa,cAAe,SAAQ,4CAAwB;IAC1D,YAAY,MAAc,EAAE,QAAgB,qBAAqB,EAAE,OAAgB;QACjF,KAAK,CACH,QAAQ,EACR,MAAM,EACN,KAAK,EACL,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,+BAAuB,EACjE,qDAAqD,CACtD,CAAC;IACJ,CAAC;CACF;AAVD,wCAUC"}
@@ -0,0 +1,65 @@
1
+ import { RewriteOptions } from '../types';
2
+ import { VideoGenerationResult } from './video-providers/types';
3
+ export { DEFAULT_MINIMAX_VIDEO_URL } from './video-providers/minimax';
4
+ export { DEFAULT_DOUBAO_VIDEO_URL } from './video-providers/doubao';
5
+ export { DEFAULT_KLING_VIDEO_URL } from './video-providers/kling';
6
+ export type { VideoGenerationResult } from './video-providers/types';
7
+ export interface VideoGenerationConfig {
8
+ /** 视频生成 Provider */
9
+ provider: 'minimax' | 'doubao' | 'kling' | 'runway';
10
+ /** API Key */
11
+ apiKey: string;
12
+ /** 视频模型 */
13
+ model?: string;
14
+ /** 视频时长(秒) */
15
+ duration?: number;
16
+ /** 视频分辨率 */
17
+ resolution?: string;
18
+ /** 宽高比 */
19
+ aspectRatio?: string;
20
+ /** 是否自动优化提示词,默认 true */
21
+ promptOptimizer?: boolean;
22
+ /** 轮询间隔(毫秒),默认 5000 */
23
+ pollInterval?: number;
24
+ /** 最大轮询次数,默认 120(10分钟) */
25
+ maxPollAttempts?: number;
26
+ /** 是否显示详细日志 */
27
+ verbose?: boolean;
28
+ }
29
+ /**
30
+ * 视频生成器
31
+ *
32
+ * 支持的 Provider:
33
+ * - minimax: MiniMax Hailuo (默认)
34
+ * - doubao: 火山引擎豆包 Seedance
35
+ * - kling: 快手可灵
36
+ * - runway: Runway Gen-4.5
37
+ */
38
+ export declare class VideoGenerator {
39
+ private config;
40
+ private provider;
41
+ constructor(config: VideoGenerationConfig);
42
+ /**
43
+ * 创建视频 Provider
44
+ */
45
+ private createProvider;
46
+ /**
47
+ * 从 Markdown 生成视频
48
+ */
49
+ generateFromMarkdown(markdown: string, summaryProvider?: {
50
+ rewrite: (text: string, options: RewriteOptions) => Promise<string>;
51
+ }): Promise<VideoGenerationResult>;
52
+ /**
53
+ * 使用 AI 生成视频脚本提示词
54
+ */
55
+ private generateVideoPrompt;
56
+ /**
57
+ * 简单提取提示词(不使用 AI)
58
+ */
59
+ private extractSimplePrompt;
60
+ /**
61
+ * 生成视频
62
+ */
63
+ generateVideo(prompt: string): Promise<VideoGenerationResult>;
64
+ }
65
+ //# sourceMappingURL=video-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-generator.d.ts","sourceRoot":"","sources":["../../src/core/video-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAiB,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAM/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,oBAAoB;IACpB,QAAQ,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU;IACV,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,MAAM,EAAE,qBAAqB;IAczC;;OAEG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,GACxF,OAAO,CAAC,qBAAqB,CAAC;IAyBjC;;OAEG;YACW,mBAAmB;IA2BjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAWpE"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoGenerator = exports.DEFAULT_KLING_VIDEO_URL = exports.DEFAULT_DOUBAO_VIDEO_URL = exports.DEFAULT_MINIMAX_VIDEO_URL = void 0;
4
+ const minimax_1 = require("./video-providers/minimax");
5
+ const doubao_1 = require("./video-providers/doubao");
6
+ const kling_1 = require("./video-providers/kling");
7
+ const runway_1 = require("./video-providers/runway");
8
+ var minimax_2 = require("./video-providers/minimax");
9
+ Object.defineProperty(exports, "DEFAULT_MINIMAX_VIDEO_URL", { enumerable: true, get: function () { return minimax_2.DEFAULT_MINIMAX_VIDEO_URL; } });
10
+ var doubao_2 = require("./video-providers/doubao");
11
+ Object.defineProperty(exports, "DEFAULT_DOUBAO_VIDEO_URL", { enumerable: true, get: function () { return doubao_2.DEFAULT_DOUBAO_VIDEO_URL; } });
12
+ var kling_2 = require("./video-providers/kling");
13
+ Object.defineProperty(exports, "DEFAULT_KLING_VIDEO_URL", { enumerable: true, get: function () { return kling_2.DEFAULT_KLING_VIDEO_URL; } });
14
+ /**
15
+ * 视频生成器
16
+ *
17
+ * 支持的 Provider:
18
+ * - minimax: MiniMax Hailuo (默认)
19
+ * - doubao: 火山引擎豆包 Seedance
20
+ * - kling: 快手可灵
21
+ * - runway: Runway Gen-4.5
22
+ */
23
+ class VideoGenerator {
24
+ constructor(config) {
25
+ this.config = {
26
+ duration: 6,
27
+ resolution: '1080P',
28
+ aspectRatio: '16:9',
29
+ promptOptimizer: true,
30
+ pollInterval: 5000,
31
+ maxPollAttempts: 120,
32
+ ...config,
33
+ };
34
+ this.provider = this.createProvider();
35
+ }
36
+ /**
37
+ * 创建视频 Provider
38
+ */
39
+ createProvider() {
40
+ const { provider, apiKey, model, pollInterval, maxPollAttempts, verbose } = this.config;
41
+ const options = { pollInterval, maxPollAttempts, verbose };
42
+ switch (provider) {
43
+ case 'minimax':
44
+ return new minimax_1.MiniMaxVideoProvider(apiKey, model || 'MiniMax-Hailuo-2.3', options);
45
+ case 'doubao':
46
+ return new doubao_1.DoubaoVideoProvider(apiKey, model || 'seedance-2.0-lite-t2v-250428', options);
47
+ case 'kling':
48
+ return new kling_1.KlingVideoProvider(apiKey, model || 'kling-v1', options);
49
+ case 'runway':
50
+ return new runway_1.RunwayVideoProvider(apiKey, model || 'gen4.5', { verbose });
51
+ default:
52
+ throw new Error(`不支持的视频 Provider: ${provider}`);
53
+ }
54
+ }
55
+ /**
56
+ * 从 Markdown 生成视频
57
+ */
58
+ async generateFromMarkdown(markdown, summaryProvider) {
59
+ try {
60
+ // 1. 生成视频脚本提示词
61
+ let videoPrompt;
62
+ if (summaryProvider) {
63
+ videoPrompt = await this.generateVideoPrompt(markdown, summaryProvider);
64
+ }
65
+ else {
66
+ videoPrompt = this.extractSimplePrompt(markdown);
67
+ }
68
+ if (this.config.verbose) {
69
+ console.log(`🎬 视频脚本提示词:\n${videoPrompt}\n`);
70
+ }
71
+ // 2. 调用 Provider 生成视频
72
+ return await this.generateVideo(videoPrompt);
73
+ }
74
+ catch (error) {
75
+ return {
76
+ success: false,
77
+ error: error.message,
78
+ };
79
+ }
80
+ }
81
+ /**
82
+ * 使用 AI 生成视频脚本提示词
83
+ */
84
+ async generateVideoPrompt(markdown, provider) {
85
+ const duration = this.config.duration || 6;
86
+ const prompt = `请将以下文章内容转换为一个 ${duration} 秒短视频的脚本提示词。
87
+
88
+ 要求:
89
+ 1. 提取文章的核心主题和关键信息
90
+ 2. 用生动、视觉化的语言描述场景
91
+ 3. 适合 AI 视频生成,包含具体的画面描述
92
+ 4. 可以添加镜头指令如 [Zoom in]、[Pan left]、[Static shot] 等
93
+ 5. 输出长度控制在 200-500 字之间
94
+ 6. 只输出视频脚本,不要其他解释
95
+
96
+ 文章内容:
97
+ ${markdown.slice(0, 3000)}`;
98
+ const result = await provider.rewrite(prompt, {
99
+ style: 'creative',
100
+ temperature: 0.8,
101
+ maxTokens: 1000,
102
+ });
103
+ return result;
104
+ }
105
+ /**
106
+ * 简单提取提示词(不使用 AI)
107
+ */
108
+ extractSimplePrompt(markdown) {
109
+ let text = markdown
110
+ .replace(/^#+\s+/gm, '')
111
+ .replace(/!\[.*?\]\(.*?\)/g, '')
112
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
113
+ .replace(/```[\s\S]*?```/g, '')
114
+ .replace(/`[^`]+`/g, '')
115
+ .replace(/[*_~]+/g, '')
116
+ .replace(/>\s+/g, '')
117
+ .replace(/[-*+]\s+/g, '')
118
+ .replace(/\n{2,}/g, '\n')
119
+ .trim();
120
+ if (text.length > 500) {
121
+ text = text.slice(0, 500) + '...';
122
+ }
123
+ return `基于以下内容生成一个视觉化的场景 [Static shot]:\n${text}`;
124
+ }
125
+ /**
126
+ * 生成视频
127
+ */
128
+ async generateVideo(prompt) {
129
+ const { duration, resolution, aspectRatio, promptOptimizer } = this.config;
130
+ return this.provider.generateVideo({
131
+ prompt,
132
+ duration,
133
+ resolution,
134
+ aspectRatio,
135
+ promptOptimizer,
136
+ });
137
+ }
138
+ }
139
+ exports.VideoGenerator = VideoGenerator;
140
+ //# sourceMappingURL=video-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-generator.js","sourceRoot":"","sources":["../../src/core/video-generator.ts"],"names":[],"mappings":"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"}