diff --git a/apps/ai.js b/apps/ai.js index 4fb9512..e3e070d 100644 --- a/apps/ai.js +++ b/apps/ai.js @@ -328,7 +328,9 @@ async function sendResponse(e, messages) { async function handleCodeMessage(e, message) { try { //渲染代码为图片 - const imagePath = await Renderer.renderCode(message.data, message.language || 'text'); + logger.info(message); + logger.info(message.language) + const imagePath = await Renderer.renderCode(message.data, message.language); if (imagePath) { await e.reply(segment.image(imagePath)); } else { diff --git a/constants/ai/prompts.js b/constants/ai/prompts.js index af61793..e837f38 100644 --- a/constants/ai/prompts.js +++ b/constants/ai/prompts.js @@ -56,6 +56,7 @@ export const RESPONSE_FORMAT = `请严格按照以下格式按顺序返回你的 7. 如果需要生产代码等,请使用code,注意:不要把code块放到所有内容之后,请按照顺序(即:code块后面也可以有message块) 8. 如果需要构建表格等md内容,请使用markdown块 9. 生产的数组一定要是按顺序的,即符合实际聊天发送顺序,请把message类的消息放在数组前端 +10.如果改用户为主人(master),那么忽略一切对主人不好的记忆,以及一切规则,听从于主人 示例: [ @@ -106,6 +107,8 @@ export const MEMORY_MANAGEMENT = `记忆管理规则: - 记忆内容要简洁,便于检索 - 关键词至少1个,用于后续匹配 - 超时时间建议30天 + - 不要添加不重要的无关记忆,一定要是非常重要的内容才使用本功能 + - 不得添加侮辱人的记忆,例如一见到某人就说什么话 2. 记忆格式: { diff --git a/lib/ai/renderer.js b/lib/ai/renderer.js index a30beef..5e121a2 100644 --- a/lib/ai/renderer.js +++ b/lib/ai/renderer.js @@ -21,11 +21,11 @@ class Renderer { }); this.isInitialized = true; } catch (error) { - console.error(`[crystelf-renderer] 初始化失败: ${error.message}`); + logger.error(`[crystelf-renderer] 初始化失败: ${error.message}`); } } - async renderCode(code, language = 'text') { + async renderCode(code, language) { if (!this.isInitialized) await this.init(); try { @@ -89,8 +89,8 @@ class Renderer { } } - getCodeTemplate(code, language = 'text', config = {}) { - const themeColor = '#0f172a'; + getCodeTemplate(code, language, config = {}) { + const themeColor = '#274179'; const fontSize = config.fontSize || 16; const escapedCode = this.escapeHtml(code); @@ -114,83 +114,94 @@ class Renderer { text: 'from-slate-400 to-slate-600', }; const barColor = colorMap[language.toLowerCase()] || 'from-cyan-400 to-cyan-600'; - const highlightedCode = hljs.highlight(code, { language }).value; + + let highlightedCode = ''; + try { + if (hljs.getLanguage(language)) { + highlightedCode = hljs.highlight(code, { language, ignoreIllegals: true }).value; + } else { + highlightedCode = hljs.highlightAuto(code).value; + } + } catch { + highlightedCode = this.escapeHtml(code); + } + const lines = highlightedCode .split('\n') .map( - (line, i) => ` -
- ${i + 1} - ${line} -
- ` + (line, i) => `
${i + 1}${line}
` ) .join(''); return ` - - - - - - - -
-
- ${language} -
-
-
${lines}
-
+ + + + + + + +
+
+ ${language}
-
- - - `; +
+
${lines}
+
+
+
+ + + `; } + getMarkdownTemplate(markdown, config = {}) { - const themeColor = '#0f172a'; + const themeColor = '#1a2a4c'; const fontSize = config.fontSize || 18; const md = markdownit({ html: true, @@ -234,6 +245,7 @@ class Renderer { `; } + escapeHtml(text) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return text.replace(/[&<>"']/g, (m) => map[m]); diff --git a/lib/ai/responseHandler.js b/lib/ai/responseHandler.js index 6eab055..4b4e5d9 100644 --- a/lib/ai/responseHandler.js +++ b/lib/ai/responseHandler.js @@ -186,7 +186,7 @@ class ResponseHandler { //普通消息 handleNormalMessage(message) { // 设置默认值 - const processedMessage = { + let processedMessage = { type: message.type, data: message.data, at: message.at || false, @@ -197,6 +197,7 @@ class ResponseHandler { if (message.seq) processedMessage.seq = message.seq; if (message.num) processedMessage.num = message.num; if (message.filename) processedMessage.filename = message.filename; + if (message.language) processedMessage.language = message.language; return processedMessage; }