@advjs/ai
Version:
AI module for AdvJS
122 lines (114 loc) • 3.87 kB
JavaScript
import path from 'node:path';
import { consola } from 'consola';
import fs from 'fs-extra';
import process from 'node:process';
import OpenAI from 'openai';
import 'dotenv/config';
import { hunyuan } from 'tencentcloud-sdk-nodejs-hunyuan';
function walkChapterNodes({ json }) {
const nodes = [];
json.chapters.forEach((chapter) => {
chapter.nodes.forEach((node) => {
nodes.push(node.id);
});
});
return nodes;
}
const promptsDir = path.resolve(import.meta.dirname, "../prompts");
path.resolve(import.meta.dirname, "../dist");
const typesDir = path.resolve(import.meta.dirname, "./types");
const dramaWriterPath = path.resolve(promptsDir, "drama-writer.md");
const prompts = {
dramaWriter: fs.readFileSync(dramaWriterPath, "utf-8")
};
const configTSPath = path.resolve(typesDir, "config.ts");
const configTSContent = fs.readFileSync(configTSPath, "utf-8");
path.resolve(import.meta.dirname, "../examples/ai-generated");
function renderTemplate(template, variables) {
return template.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (_, key) => {
const value = variables[key.trim()];
return value !== void 0 ? String(value) : "";
});
}
const openai = new OpenAI({
baseURL: "https://api.deepseek.com",
// apiKey: '<DeepSeek API Key>'
apiKey: process.env.DEEPSEEK_API_KEY
});
async function generateAdvDramaJSON(params) {
const dramaWriterPrompt = renderTemplate(prompts.dramaWriter, {
dts: configTSContent,
story_background: params.storyBackground
});
consola.debug("dramaWriterPrompt:", dramaWriterPrompt);
const completion = await openai.chat.completions.create({
messages: [
{ role: "system", content: dramaWriterPrompt }
],
model: "deepseek-chat",
response_format: {
type: "json_object"
}
});
return completion.choices[0].message.content;
}
const hunyuanClient = new hunyuan.v20230901.Client({
credential: {
secretId: process.env.TENCENT_CLOUD_SECRET_ID || "",
secretKey: process.env.TENCENT_CLOUD_SECRET_KEY || ""
},
region: process.env.TENCENT_CLOUD_REGION || "ap-guangzhou",
profile: {
httpProfile: {
reqMethod: "POST",
reqTimeout: 30,
endpoint: "hunyuan.tencentcloudapi.com"
}
}
});
const HUNYUAN_STYLES = {
"\uFF08\u4E0D\u9650\u5B9A\u98CE\u683C\uFF09": "000",
"\u6C34\u58A8\u753B": "101",
"\u6982\u5FF5\u827A\u672F": "102",
"\u6CB9\u753B1": "103",
"\u6CB9\u753B2\uFF08\u68B5\u9AD8\uFF09": "118",
"\u6C34\u5F69\u753B": "104",
"\u50CF\u7D20\u753B": "105",
"\u539A\u6D82\u98CE\u683C": "106",
"\u63D2\u56FE": "107",
"\u526A\u7EB8\u98CE\u683C": "108",
"\u5370\u8C61\u6D3E1\uFF08\u83AB\u5948\uFF09": "109",
"\u5370\u8C61\u6D3E2": "119",
"2.5D": "110",
"\u53E4\u5178\u8096\u50CF\u753B": "111",
"\u9ED1\u767D\u7D20\u63CF\u753B": "112",
"\u8D5B\u535A\u670B\u514B": "113",
"\u79D1\u5E7B\u98CE\u683C": "114",
"\u6697\u9ED1\u98CE\u683C": "115",
"3D": "116",
"\u84B8\u6C7D\u6CE2": "117",
"\u65E5\u7CFB\u52A8\u6F2B": "201",
"\u602A\u517D\u98CE\u683C": "202",
"\u552F\u7F8E\u53E4\u98CE": "203",
"\u590D\u53E4\u52A8\u6F2B": "204",
"\u6E38\u620F\u5361\u901A\u624B\u7ED8": "301",
"\u901A\u7528\u5199\u5B9E\u98CE\u683C": "401"
};
async function writerWorkflow(params) {
const aiStr = await generateAdvDramaJSON(params);
try {
const aiData = JSON.parse(aiStr || "{}");
if (params.outputDir) {
await fs.ensureDir(params.outputDir);
const fileName = params.overwrite ? "adv.ai.json" : `adv.ai.${Date.now()}.json`;
await fs.writeJSON(path.resolve(params.outputDir, fileName), aiData, {
spaces: 2,
EOL: "\n"
});
}
consola.success("\u{1F500} [ADV Writer] completed successfully.");
} catch (error) {
consola.error("\u{1F500} [ADV Writer] failed:", error);
}
}
export { HUNYUAN_STYLES, hunyuanClient, walkChapterNodes, writerWorkflow };