78 lines
2.3 KiB
JavaScript
78 lines
2.3 KiB
JavaScript
"use strict";
|
||
|
||
/**
|
||
* 选题库一键仿写标题(对齐 Electron ipAgent:rewriteTitles)
|
||
*/
|
||
|
||
const pipelineNative = require("./pipeline_native.js");
|
||
const desktopConfig = require("./desktop_config.js");
|
||
|
||
const DEFAULT_TOPIC_REWRITE_PROMPT = `参考以下标题,帮我生成新的标题。要求:
|
||
1. 保持相似的主题和风格
|
||
2. 标题简洁有力
|
||
3. 不要添加表情符号和标签
|
||
4. 直接输出与参考数量相同的新标题,每行一个,不要编号
|
||
|
||
参考标题:
|
||
{{content}}
|
||
|
||
请生成新标题:`;
|
||
|
||
function buildTopicRewritePrompt(titles, customPrompt) {
|
||
const titlesText = titles.map((t, i) => `${i + 1}. ${t}`).join("\n");
|
||
let prompt = String(customPrompt || "").trim();
|
||
if (!prompt) {
|
||
prompt = DEFAULT_TOPIC_REWRITE_PROMPT;
|
||
}
|
||
return prompt
|
||
.replace(/\{\{content\}\}/g, titlesText)
|
||
.replace(/\{content\}/g, titlesText);
|
||
}
|
||
|
||
function parseRewrittenLines(content, fallbackTitles) {
|
||
const lines = String(content || "")
|
||
.trim()
|
||
.split("\n")
|
||
.map((line) => line.replace(/^[\d\s.\-、]+/, "").trim())
|
||
.filter(Boolean);
|
||
|
||
if (lines.length >= fallbackTitles.length) {
|
||
return lines.slice(0, fallbackTitles.length);
|
||
}
|
||
const out = [...lines];
|
||
for (let i = lines.length; i < fallbackTitles.length; i++) {
|
||
out.push(fallbackTitles[i]);
|
||
}
|
||
return out;
|
||
}
|
||
|
||
globalThis.__nodejsMain = async function (params) {
|
||
const titles = Array.isArray(params?.titles) ? params.titles.filter(Boolean) : [];
|
||
if (titles.length === 0) {
|
||
return { success: false, error: "没有可仿写的标题" };
|
||
}
|
||
|
||
const modelConfig = desktopConfig.buildModelConfig();
|
||
const check = desktopConfig.validateModelConfig(modelConfig);
|
||
if (!check.ok) {
|
||
return { success: false, error: check.error };
|
||
}
|
||
|
||
const prompt = buildTopicRewritePrompt(titles, params?.rewritePrompt);
|
||
const chat = await pipelineNative.openaiChat({
|
||
apiUrl: modelConfig.apiUrl,
|
||
apiKey: modelConfig.apiKey,
|
||
model: modelConfig.apiModelId,
|
||
messages: [{ role: "user", content: prompt }],
|
||
temperature: 0.85,
|
||
max_tokens: 1500,
|
||
});
|
||
|
||
if (!chat?.success || !chat.content) {
|
||
return { success: false, error: chat?.error || "标题仿写失败" };
|
||
}
|
||
|
||
const rewrittenTitles = parseRewrittenLines(chat.content, titles);
|
||
return { success: true, rewrittenTitles };
|
||
};
|