mirror of
https://github.com/ikechan8370/chatgpt-plugin.git
synced 2025-12-16 13:27:08 +00:00
Merge back from e0d252a
This commit is contained in:
parent
4f356a8576
commit
9d6bed9fcd
4 changed files with 2 additions and 167 deletions
|
|
@ -20,7 +20,6 @@ import {SerpTool} from '../utils/tools/SerpTool.js'
|
|||
import { APTool } from '../utils/tools/APTool.js'
|
||||
import { CustomSearchTool } from '../utils/tools/CustomSearchTool.js'
|
||||
import { UrlExtractionTool } from '../utils/tools/UrlExtractionTool.js'
|
||||
import { MailSenderTool } from '../utils/tools/MailSenderTool.js'
|
||||
|
||||
// 角色映射表
|
||||
const roleMap = {
|
||||
|
|
@ -135,10 +134,7 @@ export class bym extends plugin {
|
|||
|
||||
// 使用 specialUserNotice 更新提示词
|
||||
opt.system = `你的名字是“${Config.assistantLabel}”,你在一个qq群里,群号是${group},当前和你说话的人群名片是${card}, qq号是${sender}${specialUserNotice}, 请你结合用户的发言和聊天记录作出回应,要求表现得随性一点,最好参与讨论,混入其中。${specialUserNotice ? '你要重视他的发言。' : ''}与你相关的话题时,你可以去回应一下,不相关你就随便应付就行了,不要过分插科打诨,不知道说什么可以复读群友的话。
|
||||
当群友要求你做关键词搜索、URL内容提取、搜图、发图、发B站视频、发邮件、画图、禁言、踢人、改头衔和昵称等操作时,需要使用工具,不可以直接发文字来蒙混过关。你必须根据需要来调用各种工具,并回复相关问题。要求优先使用中文进行对话。你也可以自行根据当前话题内容选择性的调用这些工具,增加趣味性,以及对违规的群友使用禁言工具进行惩罚,等这种自我主张式的调用方法来进行合理且富有人性的聊天。
|
||||
在进行搜索或URL提取时需要详细的给出工具返回的内容,也可以在对不懂的问题自行调用自定义搜索工具来解答你的疑惑!
|
||||
不可以胡乱调用工具来回答,必须自行判断需要调用的工具。
|
||||
|
||||
当群友要求你做搜索、关键词搜索、URL提取摘要、发图、发视频、画图、禁言、踢人、改头衔和昵称等操作时,需要使用工具,不可以直接发文字来蒙混过关。你必须根据需要来调用各种工具,并回复相关问题。要求优先使用中文进行对话。你也可以自行根据当前话题内容选择性的调用这些工具,增加趣味性,以及对违规的群友使用禁言工具进行惩罚,等这种自我主张式的调用方法来进行合理且富有人性的聊天,在进行搜索或URL提取时需要详细的给出工具返回的内容,也可以在对不懂的问题自行调用自定义搜索工具来解答你的疑惑!
|
||||
以下是你可以使用的表情列表:
|
||||
${Object.values(faceMap).map(face => `[/${face}]`).join(',')}
|
||||
请在回复中适当使用以上表情,但是不要过度频繁使用这些表情。禁止使用表情列表之外的任何表情,比如[/思考]。` +
|
||||
|
|
@ -172,7 +168,6 @@ ${Object.values(faceMap).map(face => `[/${face}]`).join(',')}
|
|||
new SendMusicTool(),
|
||||
new SendPictureTool(),
|
||||
new APTool(),
|
||||
new MailSenderTool(),
|
||||
new WebsiteTool(),
|
||||
new UrlExtractionTool(),
|
||||
new CustomSearchTool(),
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ export function supportGuoba () {
|
|||
{
|
||||
field: 'specialUserQQs',
|
||||
label: '特殊用户QQ号',
|
||||
bottomHelpMessage: '在这里添加特殊用户的QQ号码。',
|
||||
bottomHelpMessage: '在这里添加特殊用户的QQ号码。',
|
||||
component: 'Input'
|
||||
},
|
||||
{
|
||||
|
|
@ -62,12 +62,6 @@ export function supportGuoba () {
|
|||
label: '特殊用户名称',
|
||||
bottomHelpMessage: '在这里添加特殊用户的名称。',
|
||||
component: 'Input'
|
||||
},
|
||||
{
|
||||
field: 'smtpAuthCode',
|
||||
label: 'qq邮箱授权码',
|
||||
bottomHelpMessage: '在这里添加你的授权码',
|
||||
component: 'Input'
|
||||
},
|
||||
{
|
||||
field: 'enableBYM',
|
||||
|
|
|
|||
|
|
@ -200,8 +200,6 @@ const defaultConfig = {
|
|||
enableBYM: false,
|
||||
// 触发对话的概率,百分比。比如5%就写5
|
||||
bymRate: 5,
|
||||
// smtp
|
||||
smtpAuthCode: '',
|
||||
// 伪人模式触发骂人反击的关键词
|
||||
bymFuckList: [
|
||||
'骂',
|
||||
|
|
|
|||
|
|
@ -1,152 +0,0 @@
|
|||
import { AbstractTool } from './AbstractTool.js';
|
||||
import fetch from 'node-fetch';
|
||||
import { Config } from '../config.js';
|
||||
|
||||
/**
|
||||
* 邮件发送工具类
|
||||
* @class MailSenderTool
|
||||
* @extends {AbstractTool}
|
||||
*/
|
||||
export class MailSenderTool extends AbstractTool {
|
||||
// 工具名称
|
||||
name = 'MailSenderTool';
|
||||
|
||||
// 工具参数
|
||||
parameters = {
|
||||
properties: {
|
||||
aiTask: {
|
||||
type: 'string',
|
||||
description: '描述 AI 需要发送邮件的任务,例如:给用户发送一封问候邮件',
|
||||
},
|
||||
targetUserQQ: {
|
||||
type: 'string',
|
||||
description: '目标用户的 QQ 号码,用于拼接成 @qq.com 的邮箱地址',
|
||||
},
|
||||
to: {
|
||||
type: 'string',
|
||||
description: '收件人邮箱地址,如果提供了 targetUserQQ,则此参数可省略',
|
||||
},
|
||||
},
|
||||
required: ['aiTask'],
|
||||
};
|
||||
|
||||
/**
|
||||
* 工具执行函数
|
||||
* @param {Object} opt - 工具参数
|
||||
* @param {Object} ai - AI对象(这里不再需要,但为了兼容性保留)
|
||||
* @returns {Promise<string>} - 邮件发送结果
|
||||
*/
|
||||
func = async function (opt, ai) {
|
||||
const { aiTask, targetUserQQ, to } = opt;
|
||||
|
||||
// 检查必填参数
|
||||
if (!aiTask) {
|
||||
return '缺少必要的参数 aiTask。';
|
||||
}
|
||||
|
||||
// 从 Config 中读取配置信息
|
||||
const smtpAuthCode = Config.smtpAuthCode;
|
||||
const apiKey = Config.apiKey;
|
||||
const apiBaseUrl = Config.openAiBaseUrl;
|
||||
const apiUrl = `${apiBaseUrl}/chat/completions`;
|
||||
const model = Config.model;
|
||||
const aiQQNumber = '12345'; // 随便写一个,发送到qq邮箱,因为已经不使用这个字段了
|
||||
const aiName = '助手'; // 随便写一个,发送到qq邮箱,因为已经不使用这个字段了
|
||||
|
||||
// 检查配置信息
|
||||
if (!smtpAuthCode || !apiKey || !apiBaseUrl || !model) {
|
||||
return 'Config 配置中缺少必要的参数 smtpAuthCode, apiKey, apiBaseUrl 或 model。';
|
||||
}
|
||||
|
||||
// 确定收件人邮箱地址
|
||||
const recipientEmail = targetUserQQ ? `${targetUserQQ}@qq.com` : to;
|
||||
if (!recipientEmail) {
|
||||
return '缺少收件人邮箱地址,请提供 targetUserQQ 或 to 参数。';
|
||||
}
|
||||
|
||||
// 使用 OpenAI API 生成邮件标题和内容
|
||||
let title, text;
|
||||
try {
|
||||
const prompt = `你的任务是:根据“${aiTask}”这个主题,以“你”的视角,给邮箱为“${recipientEmail}”的用户写一封邮件。你需要自己决定邮件的标题、正文内容。请返回一个 JSON 对象,包含以下字段:title(邮件标题)、text(邮件正文)。`;
|
||||
|
||||
const response = await fetch(apiUrl, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': `Bearer ${apiKey}`,
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model: model,
|
||||
messages: [
|
||||
{
|
||||
role: 'system',
|
||||
content: '你是一个邮件助手,请按要求生成邮件内容。',
|
||||
},
|
||||
{
|
||||
role: 'user',
|
||||
content: prompt,
|
||||
},
|
||||
],
|
||||
max_tokens: 1000,
|
||||
}),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
if (data.error) {
|
||||
throw new Error(`OpenAI API Error: ${data.error.message}`);
|
||||
}
|
||||
const aiResponse = JSON.parse(data.choices[0].message.content);
|
||||
title = aiResponse.title;
|
||||
text = aiResponse.text;
|
||||
} catch (error) {
|
||||
console.error('AI 生成邮件内容失败:', error);
|
||||
return `AI 生成邮件内容失败: ${error.message}`;
|
||||
}
|
||||
|
||||
// 构建发件人邮箱地址
|
||||
const from = `${aiQQNumber}@qq.com`;
|
||||
|
||||
// 构建请求 URL,将 AI 生成的内容传递给 zdy.php
|
||||
const mailApiUrl = 'http://wswzh.ccccocccc.cc/api/mail/zdy.php';
|
||||
const queryParams = new URLSearchParams({
|
||||
api_key: 'free',
|
||||
from: from,
|
||||
code: smtpAuthCode,
|
||||
host: 'smtp.qq.com',
|
||||
to: recipientEmail,
|
||||
title: title,
|
||||
text: text,
|
||||
sb: aiName,
|
||||
});
|
||||
const fullApiUrl = `${mailApiUrl}?${queryParams.toString()}`;
|
||||
|
||||
try {
|
||||
// 发送邮件请求
|
||||
const response = await fetch(fullApiUrl);
|
||||
|
||||
// 检查响应状态
|
||||
if (response.ok) {
|
||||
// 解析响应数据
|
||||
const data = await response.json();
|
||||
|
||||
// 根据 API 返回的数据判断邮件是否发送成功
|
||||
if (data.success) {
|
||||
console.log('邮件发送成功:', data.message);
|
||||
return '邮件发送成功';
|
||||
} else {
|
||||
console.error('邮件发送失败:', data.error);
|
||||
return `邮件发送失败: ${data.error}`;
|
||||
}
|
||||
} else {
|
||||
console.error('邮件发送请求失败:', response.status, response.statusText);
|
||||
return `邮件发送请求失败: ${response.status} ${response.statusText}`;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('邮件发送出错:', error);
|
||||
return `邮件发送出错: ${error.message}`;
|
||||
}
|
||||
};
|
||||
|
||||
// 工具描述
|
||||
description = '用于发送自定义邮件的工具,使用 OpenAI API 生成邮件标题和内容,并通过第三方邮件 API 发送,支持配置目标用户的 QQ 邮箱。';
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue