@edtools/cli 0.1.0 ā 0.3.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.
- package/bin/edtools.js +0 -0
- package/dist/chunk-OA4N744J.js +527 -0
- package/dist/chunk-P36STMVX.js +519 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +41 -10
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +43 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +84 -17
- package/dist/core/generator.d.ts +6 -2
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +98 -30
- package/dist/core/generator.js.map +1 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.js +1 -1
- package/dist/types/content.d.ts +4 -0
- package/dist/types/content.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -115,6 +115,38 @@ export async function initCommand(options) {
|
|
|
115
115
|
default: productInfo.features?.join(', '),
|
|
116
116
|
filter: (input) => input.split(',').map((f) => f.trim()).filter(Boolean),
|
|
117
117
|
},
|
|
118
|
+
{
|
|
119
|
+
type: 'list',
|
|
120
|
+
name: 'preferredProvider',
|
|
121
|
+
message: 'AI provider preference:',
|
|
122
|
+
choices: [
|
|
123
|
+
{ name: 'Claude (Anthropic) - Recommended', value: 'anthropic' },
|
|
124
|
+
{ name: 'ChatGPT (OpenAI)', value: 'openai' },
|
|
125
|
+
],
|
|
126
|
+
default: 'anthropic',
|
|
127
|
+
},
|
|
128
|
+
]);
|
|
129
|
+
console.log(chalk.cyan('\nš API Key Setup:\n'));
|
|
130
|
+
const apiKeyAnswer = await inquirer.prompt([
|
|
131
|
+
{
|
|
132
|
+
type: 'password',
|
|
133
|
+
name: 'apiKey',
|
|
134
|
+
message: answers.preferredProvider === 'anthropic'
|
|
135
|
+
? 'Anthropic API Key (from https://console.anthropic.com):'
|
|
136
|
+
: 'OpenAI API Key (from https://platform.openai.com/api-keys):',
|
|
137
|
+
validate: (input) => {
|
|
138
|
+
if (!input || input.trim().length === 0) {
|
|
139
|
+
return 'API key is required';
|
|
140
|
+
}
|
|
141
|
+
if (answers.preferredProvider === 'anthropic' && !input.startsWith('sk-ant-')) {
|
|
142
|
+
return 'Anthropic API keys should start with "sk-ant-"';
|
|
143
|
+
}
|
|
144
|
+
if (answers.preferredProvider === 'openai' && !input.startsWith('sk-')) {
|
|
145
|
+
return 'OpenAI API keys should start with "sk-"';
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
},
|
|
149
|
+
},
|
|
118
150
|
]);
|
|
119
151
|
const finalProductInfo = {
|
|
120
152
|
...productInfo,
|
|
@@ -129,6 +161,7 @@ export async function initCommand(options) {
|
|
|
129
161
|
websiteUrl: ${JSON.stringify(finalProductInfo.websiteUrl)},
|
|
130
162
|
pricingModel: ${JSON.stringify(finalProductInfo.pricingModel)},
|
|
131
163
|
features: ${JSON.stringify(finalProductInfo.features, null, 2)},
|
|
164
|
+
preferredProvider: ${JSON.stringify(finalProductInfo.preferredProvider)},
|
|
132
165
|
},
|
|
133
166
|
|
|
134
167
|
content: {
|
|
@@ -146,15 +179,22 @@ export async function initCommand(options) {
|
|
|
146
179
|
await fs.writeFile(configPath, config, 'utf-8');
|
|
147
180
|
const edtoolsDir = path.join(projectPath, '.edtools');
|
|
148
181
|
await fs.ensureDir(edtoolsDir);
|
|
182
|
+
const edtoolsConfig = {
|
|
183
|
+
apiKey: apiKeyAnswer.apiKey,
|
|
184
|
+
provider: finalProductInfo.preferredProvider,
|
|
185
|
+
};
|
|
186
|
+
const edtoolsConfigPath = path.join(edtoolsDir, 'config.json');
|
|
187
|
+
await fs.writeFile(edtoolsConfigPath, JSON.stringify(edtoolsConfig, null, 2), 'utf-8');
|
|
149
188
|
const gitignorePath = path.join(edtoolsDir, '.gitignore');
|
|
150
189
|
await fs.writeFile(gitignorePath, '*\n!.gitignore\n', 'utf-8');
|
|
151
190
|
console.log(chalk.green('\nā Configuration created successfully!\n'));
|
|
152
191
|
console.log(chalk.cyan('Files created:'));
|
|
153
192
|
console.log(` - ${chalk.white('edtools.config.js')}`);
|
|
154
|
-
console.log(` - ${chalk.white('.edtools/')} (
|
|
193
|
+
console.log(` - ${chalk.white('.edtools/config.json')} (API key stored securely)\n`);
|
|
155
194
|
console.log(chalk.cyan('Next steps:'));
|
|
156
195
|
console.log(` 1. Review ${chalk.white('edtools.config.js')}`);
|
|
157
|
-
console.log(` 2.
|
|
158
|
-
console.log(
|
|
196
|
+
console.log(` 2. Generate content: ${chalk.white('edtools generate')}\n`);
|
|
197
|
+
console.log(chalk.gray(`š” Your API key is stored locally in .edtools/config.json`));
|
|
198
|
+
console.log(chalk.gray(` This folder is gitignored to keep your key safe\n`));
|
|
159
199
|
}
|
|
160
200
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
ContentGenerator
|
|
4
|
-
|
|
5
|
-
} from "../chunk-6534GCE5.js";
|
|
3
|
+
ContentGenerator
|
|
4
|
+
} from "../chunk-P36STMVX.js";
|
|
6
5
|
|
|
7
6
|
// src/cli/index.ts
|
|
8
7
|
import { Command } from "commander";
|
|
@@ -122,6 +121,36 @@ async function initCommand(options) {
|
|
|
122
121
|
message: "Main features (comma-separated):",
|
|
123
122
|
default: productInfo.features?.join(", "),
|
|
124
123
|
filter: (input) => input.split(",").map((f) => f.trim()).filter(Boolean)
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: "list",
|
|
127
|
+
name: "preferredProvider",
|
|
128
|
+
message: "AI provider preference:",
|
|
129
|
+
choices: [
|
|
130
|
+
{ name: "Claude (Anthropic) - Recommended", value: "anthropic" },
|
|
131
|
+
{ name: "ChatGPT (OpenAI)", value: "openai" }
|
|
132
|
+
],
|
|
133
|
+
default: "anthropic"
|
|
134
|
+
}
|
|
135
|
+
]);
|
|
136
|
+
console.log(chalk.cyan("\n\u{1F511} API Key Setup:\n"));
|
|
137
|
+
const apiKeyAnswer = await inquirer.prompt([
|
|
138
|
+
{
|
|
139
|
+
type: "password",
|
|
140
|
+
name: "apiKey",
|
|
141
|
+
message: answers.preferredProvider === "anthropic" ? "Anthropic API Key (from https://console.anthropic.com):" : "OpenAI API Key (from https://platform.openai.com/api-keys):",
|
|
142
|
+
validate: (input) => {
|
|
143
|
+
if (!input || input.trim().length === 0) {
|
|
144
|
+
return "API key is required";
|
|
145
|
+
}
|
|
146
|
+
if (answers.preferredProvider === "anthropic" && !input.startsWith("sk-ant-")) {
|
|
147
|
+
return 'Anthropic API keys should start with "sk-ant-"';
|
|
148
|
+
}
|
|
149
|
+
if (answers.preferredProvider === "openai" && !input.startsWith("sk-")) {
|
|
150
|
+
return 'OpenAI API keys should start with "sk-"';
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
125
154
|
}
|
|
126
155
|
]);
|
|
127
156
|
const finalProductInfo = {
|
|
@@ -137,6 +166,7 @@ async function initCommand(options) {
|
|
|
137
166
|
websiteUrl: ${JSON.stringify(finalProductInfo.websiteUrl)},
|
|
138
167
|
pricingModel: ${JSON.stringify(finalProductInfo.pricingModel)},
|
|
139
168
|
features: ${JSON.stringify(finalProductInfo.features, null, 2)},
|
|
169
|
+
preferredProvider: ${JSON.stringify(finalProductInfo.preferredProvider)},
|
|
140
170
|
},
|
|
141
171
|
|
|
142
172
|
content: {
|
|
@@ -154,23 +184,32 @@ async function initCommand(options) {
|
|
|
154
184
|
await fs.writeFile(configPath, config, "utf-8");
|
|
155
185
|
const edtoolsDir = path.join(projectPath, ".edtools");
|
|
156
186
|
await fs.ensureDir(edtoolsDir);
|
|
187
|
+
const edtoolsConfig = {
|
|
188
|
+
apiKey: apiKeyAnswer.apiKey,
|
|
189
|
+
provider: finalProductInfo.preferredProvider
|
|
190
|
+
};
|
|
191
|
+
const edtoolsConfigPath = path.join(edtoolsDir, "config.json");
|
|
192
|
+
await fs.writeFile(edtoolsConfigPath, JSON.stringify(edtoolsConfig, null, 2), "utf-8");
|
|
157
193
|
const gitignorePath = path.join(edtoolsDir, ".gitignore");
|
|
158
194
|
await fs.writeFile(gitignorePath, "*\n!.gitignore\n", "utf-8");
|
|
159
195
|
console.log(chalk.green("\n\u2713 Configuration created successfully!\n"));
|
|
160
196
|
console.log(chalk.cyan("Files created:"));
|
|
161
197
|
console.log(` - ${chalk.white("edtools.config.js")}`);
|
|
162
|
-
console.log(` - ${chalk.white(".edtools/")} (
|
|
198
|
+
console.log(` - ${chalk.white(".edtools/config.json")} (API key stored securely)
|
|
163
199
|
`);
|
|
164
200
|
console.log(chalk.cyan("Next steps:"));
|
|
165
201
|
console.log(` 1. Review ${chalk.white("edtools.config.js")}`);
|
|
166
|
-
console.log(` 2.
|
|
167
|
-
console.log(` 3. Generate content: ${chalk.white("edtools generate")}
|
|
202
|
+
console.log(` 2. Generate content: ${chalk.white("edtools generate")}
|
|
168
203
|
`);
|
|
204
|
+
console.log(chalk.gray(`\u{1F4A1} Your API key is stored locally in .edtools/config.json`));
|
|
205
|
+
console.log(chalk.gray(` This folder is gitignored to keep your key safe
|
|
206
|
+
`));
|
|
169
207
|
}
|
|
170
208
|
|
|
171
209
|
// src/cli/commands/generate.ts
|
|
172
210
|
import fs2 from "fs-extra";
|
|
173
211
|
import path2 from "path";
|
|
212
|
+
import { pathToFileURL } from "url";
|
|
174
213
|
import chalk2 from "chalk";
|
|
175
214
|
import ora2 from "ora";
|
|
176
215
|
async function generateCommand(options) {
|
|
@@ -182,18 +221,42 @@ async function generateCommand(options) {
|
|
|
182
221
|
console.log(chalk2.yellow(' Run "edtools init" first\n'));
|
|
183
222
|
process.exit(1);
|
|
184
223
|
}
|
|
185
|
-
const
|
|
186
|
-
const
|
|
224
|
+
const configUrl = pathToFileURL(configPath).href;
|
|
225
|
+
const config = await import(configUrl);
|
|
226
|
+
const productInfo = config.default.product;
|
|
187
227
|
if (!productInfo || !productInfo.name) {
|
|
188
228
|
console.log(chalk2.red("\u2717 Invalid configuration in edtools.config.js"));
|
|
189
229
|
process.exit(1);
|
|
190
230
|
}
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
231
|
+
const provider = productInfo.preferredProvider || "anthropic";
|
|
232
|
+
let storedApiKey;
|
|
233
|
+
const edtoolsConfigPath = path2.join(projectPath, ".edtools", "config.json");
|
|
234
|
+
if (await fs2.pathExists(edtoolsConfigPath)) {
|
|
235
|
+
try {
|
|
236
|
+
const edtoolsConfig = await fs2.readJson(edtoolsConfigPath);
|
|
237
|
+
storedApiKey = edtoolsConfig.apiKey;
|
|
238
|
+
} catch (error) {
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
let apiKey;
|
|
242
|
+
if (provider === "anthropic") {
|
|
243
|
+
apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY || storedApiKey;
|
|
244
|
+
if (!apiKey) {
|
|
245
|
+
console.log(chalk2.red("\u2717 No Anthropic API key found"));
|
|
246
|
+
console.log(chalk2.yellow(' Run "edtools init" to configure your API key'));
|
|
247
|
+
console.log(chalk2.yellow(" Or set ANTHROPIC_API_KEY environment variable"));
|
|
248
|
+
console.log(chalk2.yellow(" Or use --api-key option\n"));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
} else if (provider === "openai") {
|
|
252
|
+
apiKey = options.apiKey || process.env.OPENAI_API_KEY || storedApiKey;
|
|
253
|
+
if (!apiKey) {
|
|
254
|
+
console.log(chalk2.red("\u2717 No OpenAI API key found"));
|
|
255
|
+
console.log(chalk2.yellow(' Run "edtools init" to configure your API key'));
|
|
256
|
+
console.log(chalk2.yellow(" Or set OPENAI_API_KEY environment variable"));
|
|
257
|
+
console.log(chalk2.yellow(" Or use --api-key option\n"));
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
197
260
|
}
|
|
198
261
|
const count = parseInt(options.posts, 10);
|
|
199
262
|
if (isNaN(count) || count < 1 || count > 10) {
|
|
@@ -209,10 +272,11 @@ async function generateCommand(options) {
|
|
|
209
272
|
console.log(chalk2.cyan("Configuration:"));
|
|
210
273
|
console.log(` Product: ${chalk2.white(productInfo.name)}`);
|
|
211
274
|
console.log(` Category: ${chalk2.white(productInfo.category)}`);
|
|
275
|
+
console.log(` AI Provider: ${chalk2.white(provider === "anthropic" ? "Claude (Anthropic)" : "ChatGPT (OpenAI)")}`);
|
|
212
276
|
console.log(` Posts to generate: ${chalk2.white(count)}`);
|
|
213
277
|
console.log(` Output directory: ${chalk2.white(outputDir)}
|
|
214
278
|
`);
|
|
215
|
-
const generator = new ContentGenerator(apiKey);
|
|
279
|
+
const generator = new ContentGenerator(apiKey, provider);
|
|
216
280
|
const generateConfig = {
|
|
217
281
|
productInfo,
|
|
218
282
|
topics: options.topics,
|
|
@@ -220,9 +284,12 @@ async function generateCommand(options) {
|
|
|
220
284
|
outputDir,
|
|
221
285
|
projectPath,
|
|
222
286
|
avoidDuplicates: true,
|
|
223
|
-
similarityThreshold: 0.85
|
|
287
|
+
similarityThreshold: 0.85,
|
|
288
|
+
provider,
|
|
289
|
+
apiKey
|
|
224
290
|
};
|
|
225
|
-
const
|
|
291
|
+
const providerName = provider === "anthropic" ? "Claude" : "ChatGPT";
|
|
292
|
+
const spinner = ora2(`Generating content with ${providerName}...`).start();
|
|
226
293
|
try {
|
|
227
294
|
const result = await generator.generate(generateConfig);
|
|
228
295
|
if (result.success && result.posts.length > 0) {
|
package/dist/core/generator.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { GenerateConfig, GenerateResult } from '../types/index.js';
|
|
1
|
+
import { GenerateConfig, GenerateResult, AIProvider } from '../types/index.js';
|
|
2
2
|
export declare class ContentGenerator {
|
|
3
3
|
private anthropic;
|
|
4
|
+
private openai;
|
|
5
|
+
private provider;
|
|
4
6
|
private adapters;
|
|
5
|
-
constructor(apiKey?: string);
|
|
7
|
+
constructor(apiKey?: string, provider?: AIProvider);
|
|
6
8
|
generate(config: GenerateConfig): Promise<GenerateResult>;
|
|
7
9
|
private generateContent;
|
|
10
|
+
private generateWithAnthropic;
|
|
11
|
+
private generateWithOpenAI;
|
|
8
12
|
private buildPrompt;
|
|
9
13
|
private generateSchemaOrg;
|
|
10
14
|
private calculateSEOScore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,cAAc,EACd,cAAc,EAEd,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,UAAwB;IAuBzD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAsEjD,eAAe;YA2Cf,qBAAqB;YA+BrB,kBAAkB;IA8BhC,OAAO,CAAC,WAAW;IAkDnB,OAAO,CAAC,iBAAiB;YAwBX,iBAAiB;YAsCjB,cAAc;YA2Dd,aAAa;CAyB5B"}
|
package/dist/core/generator.js
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import OpenAI from 'openai';
|
|
2
3
|
import path from 'path';
|
|
3
4
|
import fs from 'fs-extra';
|
|
4
5
|
import slugify from 'slugify';
|
|
5
6
|
import { AdapterRegistry } from '../types/adapter.js';
|
|
6
7
|
import { HTMLAdapter } from '../adapters/html/index.js';
|
|
7
8
|
export class ContentGenerator {
|
|
8
|
-
anthropic;
|
|
9
|
+
anthropic = null;
|
|
10
|
+
openai = null;
|
|
11
|
+
provider;
|
|
9
12
|
adapters;
|
|
10
|
-
constructor(apiKey) {
|
|
11
|
-
this.
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
constructor(apiKey, provider = 'anthropic') {
|
|
14
|
+
this.provider = provider;
|
|
15
|
+
if (provider === 'anthropic') {
|
|
16
|
+
this.anthropic = new Anthropic({
|
|
17
|
+
apiKey: apiKey || process.env.ANTHROPIC_API_KEY || '',
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
else if (provider === 'openai') {
|
|
21
|
+
this.openai = new OpenAI({
|
|
22
|
+
apiKey: apiKey || process.env.OPENAI_API_KEY || '',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
14
25
|
this.adapters = new AdapterRegistry();
|
|
15
26
|
this.adapters.register(new HTMLAdapter());
|
|
16
27
|
}
|
|
@@ -63,23 +74,16 @@ export class ContentGenerator {
|
|
|
63
74
|
}
|
|
64
75
|
async generateContent(productInfo, topic) {
|
|
65
76
|
const prompt = this.buildPrompt(productInfo, topic);
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
],
|
|
76
|
-
});
|
|
77
|
-
const textContent = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
78
|
-
const jsonMatch = textContent.match(/\{[\s\S]*\}/);
|
|
79
|
-
if (!jsonMatch) {
|
|
80
|
-
throw new Error('Failed to extract JSON from Claude response');
|
|
77
|
+
let contentData;
|
|
78
|
+
if (this.provider === 'anthropic') {
|
|
79
|
+
contentData = await this.generateWithAnthropic(prompt);
|
|
80
|
+
}
|
|
81
|
+
else if (this.provider === 'openai') {
|
|
82
|
+
contentData = await this.generateWithOpenAI(prompt);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
throw new Error(`Unsupported provider: ${this.provider}`);
|
|
81
86
|
}
|
|
82
|
-
const contentData = JSON.parse(jsonMatch[0]);
|
|
83
87
|
const slug = slugify(contentData.metadata.title, { lower: true, strict: true });
|
|
84
88
|
const content = {
|
|
85
89
|
metadata: {
|
|
@@ -100,6 +104,50 @@ export class ContentGenerator {
|
|
|
100
104
|
};
|
|
101
105
|
return content;
|
|
102
106
|
}
|
|
107
|
+
async generateWithAnthropic(prompt) {
|
|
108
|
+
if (!this.anthropic) {
|
|
109
|
+
throw new Error('Anthropic client not initialized');
|
|
110
|
+
}
|
|
111
|
+
const response = await this.anthropic.messages.create({
|
|
112
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
113
|
+
max_tokens: 4096,
|
|
114
|
+
temperature: 0.7,
|
|
115
|
+
messages: [
|
|
116
|
+
{
|
|
117
|
+
role: 'user',
|
|
118
|
+
content: prompt,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
const textContent = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
123
|
+
const jsonMatch = textContent.match(/\{[\s\S]*\}/);
|
|
124
|
+
if (!jsonMatch) {
|
|
125
|
+
throw new Error('Failed to extract JSON from Claude response');
|
|
126
|
+
}
|
|
127
|
+
return JSON.parse(jsonMatch[0]);
|
|
128
|
+
}
|
|
129
|
+
async generateWithOpenAI(prompt) {
|
|
130
|
+
if (!this.openai) {
|
|
131
|
+
throw new Error('OpenAI client not initialized');
|
|
132
|
+
}
|
|
133
|
+
const response = await this.openai.chat.completions.create({
|
|
134
|
+
model: 'gpt-4-turbo-preview',
|
|
135
|
+
max_tokens: 4096,
|
|
136
|
+
temperature: 0.7,
|
|
137
|
+
messages: [
|
|
138
|
+
{
|
|
139
|
+
role: 'user',
|
|
140
|
+
content: prompt,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
response_format: { type: 'json_object' },
|
|
144
|
+
});
|
|
145
|
+
const textContent = response.choices[0]?.message?.content || '';
|
|
146
|
+
if (!textContent) {
|
|
147
|
+
throw new Error('Failed to get response from OpenAI');
|
|
148
|
+
}
|
|
149
|
+
return JSON.parse(textContent);
|
|
150
|
+
}
|
|
103
151
|
buildPrompt(productInfo, topic) {
|
|
104
152
|
return `You are an expert SEO content writer. Generate a comprehensive blog post about: "${topic}"
|
|
105
153
|
|
|
@@ -204,15 +252,35 @@ Requirements:
|
|
|
204
252
|
|
|
205
253
|
Output ONLY a JSON array of topic strings, no markdown:
|
|
206
254
|
["Topic 1", "Topic 2", "Topic 3"]`;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
255
|
+
try {
|
|
256
|
+
if (this.provider === 'anthropic' && this.anthropic) {
|
|
257
|
+
const response = await this.anthropic.messages.create({
|
|
258
|
+
model: 'claude-3-5-sonnet-20241022',
|
|
259
|
+
max_tokens: 1024,
|
|
260
|
+
messages: [{ role: 'user', content: prompt }],
|
|
261
|
+
});
|
|
262
|
+
const textContent = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
263
|
+
const jsonMatch = textContent.match(/\[[\s\S]*\]/);
|
|
264
|
+
if (jsonMatch) {
|
|
265
|
+
return JSON.parse(jsonMatch[0]);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
else if (this.provider === 'openai' && this.openai) {
|
|
269
|
+
const response = await this.openai.chat.completions.create({
|
|
270
|
+
model: 'gpt-4-turbo-preview',
|
|
271
|
+
max_tokens: 1024,
|
|
272
|
+
messages: [{ role: 'user', content: prompt }],
|
|
273
|
+
response_format: { type: 'json_object' },
|
|
274
|
+
});
|
|
275
|
+
const textContent = response.choices[0]?.message?.content || '';
|
|
276
|
+
if (textContent) {
|
|
277
|
+
const data = JSON.parse(textContent);
|
|
278
|
+
return data.topics || data;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
console.warn('Failed to generate topics with AI, using fallback');
|
|
216
284
|
}
|
|
217
285
|
return [
|
|
218
286
|
`Best ${productInfo.category} software ${new Date().getFullYear()}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"AAKA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/core/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
type AIProvider = 'anthropic' | 'openai';
|
|
1
2
|
interface BlogPostMetadata {
|
|
2
3
|
title: string;
|
|
3
4
|
description: string;
|
|
@@ -94,6 +95,7 @@ interface ProductInfo {
|
|
|
94
95
|
pricingDetails?: string;
|
|
95
96
|
websiteUrl: string;
|
|
96
97
|
keywords?: string[];
|
|
98
|
+
preferredProvider?: AIProvider;
|
|
97
99
|
}
|
|
98
100
|
interface GenerateConfig {
|
|
99
101
|
productInfo: ProductInfo;
|
|
@@ -103,6 +105,8 @@ interface GenerateConfig {
|
|
|
103
105
|
projectPath: string;
|
|
104
106
|
avoidDuplicates?: boolean;
|
|
105
107
|
similarityThreshold?: number;
|
|
108
|
+
provider?: AIProvider;
|
|
109
|
+
apiKey?: string;
|
|
106
110
|
}
|
|
107
111
|
interface GenerateResult {
|
|
108
112
|
success: boolean;
|
|
@@ -139,10 +143,14 @@ declare class AdapterRegistry {
|
|
|
139
143
|
|
|
140
144
|
declare class ContentGenerator {
|
|
141
145
|
private anthropic;
|
|
146
|
+
private openai;
|
|
147
|
+
private provider;
|
|
142
148
|
private adapters;
|
|
143
|
-
constructor(apiKey?: string);
|
|
149
|
+
constructor(apiKey?: string, provider?: AIProvider);
|
|
144
150
|
generate(config: GenerateConfig): Promise<GenerateResult>;
|
|
145
151
|
private generateContent;
|
|
152
|
+
private generateWithAnthropic;
|
|
153
|
+
private generateWithOpenAI;
|
|
146
154
|
private buildPrompt;
|
|
147
155
|
private generateSchemaOrg;
|
|
148
156
|
private calculateSEOScore;
|
|
@@ -167,4 +175,4 @@ declare class HTMLAdapter implements Adapter {
|
|
|
167
175
|
private escapeHtml;
|
|
168
176
|
}
|
|
169
177
|
|
|
170
|
-
export { type Adapter, type AdapterConfig, AdapterRegistry, type BlogPostContent, type BlogPostMetadata, type CTAData, type CodeData, type ComparisonData, ContentGenerator, type ContentSection, type GenerateConfig, type GenerateResult, HTMLAdapter, type ListData, type ProductInfo, type RelatedPost, type SEOData, type SchemaOrgData };
|
|
178
|
+
export { type AIProvider, type Adapter, type AdapterConfig, AdapterRegistry, type BlogPostContent, type BlogPostMetadata, type CTAData, type CodeData, type ComparisonData, ContentGenerator, type ContentSection, type GenerateConfig, type GenerateResult, HTMLAdapter, type ListData, type ProductInfo, type RelatedPost, type SEOData, type SchemaOrgData };
|
package/dist/index.js
CHANGED
package/dist/types/content.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export type AIProvider = 'anthropic' | 'openai';
|
|
1
2
|
export interface BlogPostMetadata {
|
|
2
3
|
title: string;
|
|
3
4
|
description: string;
|
|
@@ -94,6 +95,7 @@ export interface ProductInfo {
|
|
|
94
95
|
pricingDetails?: string;
|
|
95
96
|
websiteUrl: string;
|
|
96
97
|
keywords?: string[];
|
|
98
|
+
preferredProvider?: AIProvider;
|
|
97
99
|
}
|
|
98
100
|
export interface GenerateConfig {
|
|
99
101
|
productInfo: ProductInfo;
|
|
@@ -103,6 +105,8 @@ export interface GenerateConfig {
|
|
|
103
105
|
projectPath: string;
|
|
104
106
|
avoidDuplicates?: boolean;
|
|
105
107
|
similarityThreshold?: number;
|
|
108
|
+
provider?: AIProvider;
|
|
109
|
+
apiKey?: string;
|
|
106
110
|
}
|
|
107
111
|
export interface GenerateResult {
|
|
108
112
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@edtools/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Generate SEO-optimized content for LLM discovery - CLI tool",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"fs-extra": "^11.2.0",
|
|
35
35
|
"inquirer": "^9.2.12",
|
|
36
36
|
"marked": "^11.1.1",
|
|
37
|
+
"openai": "^6.15.0",
|
|
37
38
|
"ora": "^8.0.1",
|
|
38
39
|
"slugify": "^1.6.6"
|
|
39
40
|
},
|